Yanıtlar:
Bir Groovy komut dosyasında kapsam, beklenenden farklı olabilir. Bunun nedeni, Groovy betiğinin kendi başına kodu çalıştıracak bir yönteme sahip bir sınıf olmasıdır, ancak hepsi çalışma zamanıdır. Tip tanımını atlayarak veya Groovy 1.8'de @Field açıklamasını ekleyerek betiğe dahil edilecek bir değişken tanımlayabiliriz.
import groovy.transform.Field
var1 = 'var1'
@Field String var2 = 'var2'
def var3 = 'var3'
void printVars() {
println var1
println var2
println var3 // This won't work, because not in script scope.
}
class Globalsçözüm bunun etrafında bir yoldur.
var1 = 'var1'yöntemi Groovy kullanarak bir Jenkins Pipeline'da denedim ve işe yaramadı. Ben kullanmak zorunda@Field var1 = 'var1'
class Globals {
static String ouch = "I'm global.."
}
println Globals.ouch
def iamnotglobal=100 // This will not be accessible inside the function
iamglobal=200 // this is global and will be even available inside the
def func()
{
log.info "My value is 200. Here you see " + iamglobal
iamglobal=400
//log.info "if you uncomment me you will get error. Since iamnotglobal cant be printed here " + iamnotglobal
}
def func2()
{
log.info "My value was changed inside func to 400 . Here it is = " + iamglobal
}
func()
func2()
burada iamglobal değişkeni, func tarafından kullanılan global bir değişkendir ve sonra tekrar func2 için kullanılabilir
Eğer değişkeni def ile bildirirseniz yerel olur, def kullanmazsanız global olur
Tüm OO dilleri gibi, Groovy'nin de tek başına "global" kavramı yoktur (örneğin BASIC, Python veya Perl'in aksine).
Aynı değişkeni paylaşmanız gereken birkaç yönteminiz varsa, bir alan kullanın:
class Foo {
def a;
def foo() {
a = 1;
}
def bar() {
print a;
}
}
Değişkeni sınıf veya komut dosyası kapsamında tanımlayın, ardından ona yöntemlerinizin veya kapanışlarınızın içinden erişin. Örnek olmadan, kendi probleminiz için daha spesifik olmak zor.
Bununla birlikte, genel değişkenler genellikle kötü form olarak kabul edilir.
Neden değişkeni bir işlevden döndürüp bir sonrakine geçirmiyorsunuz?
Sanırım sınıf seviyesi değişkenlerinden bahsediyorsunuz. Yukarıda belirtildiği gibi, genel değişken / sınıf seviyesi değişkenlerini kullanmak iyi bir uygulama değildir.
Gerçekten kullanmak istiyorsan. ve eğer etki olmayacağından eminseniz ...
Yöntemin dışındaki herhangi bir değişkeni bildirin. sınıf düzeyinde değişken türü olmadan
Örneğin:
{
method()
{
a=10
print(a)
}
// def a or int a wont work
a=0
}
def sum = 0
// This method stores a value in a global variable.
def add =
{
input1 , input2 ->
sum = input1 + input2;
}
// This method uses stored value.
def multiplySum =
{
input1 ->
return sum*input1;
}
add(1,2);
multiplySum(10);