Groovy'de global değişkenleri nasıl oluşturabilir ve bunlara nasıl erişebilirim?


129

Bir yöntemde bir değişkende bir değer depolamam gerekiyor ve sonra o değişkendeki bu değeri başka bir yöntemde veya kapanışta kullanmam gerekiyor. Bu değeri nasıl paylaşabilirim?

Yanıtlar:


207

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.
}

35
Alan @ 'nin bir içe aktarım gerektirdiğini belirtmek isterim .. import groovy.transform.Field
khylo

komik, daha sonra ilk satıra göre değiştirmeye çalıştı, SO altı karakterli bir düzenleme istiyor!
JimLohse

1
Bir sınıf tanımının içinden global bir değişken kullanmaya çalışıyorsanız, biraz zorlaşır. Aşağıdaki class Globalsçözüm bunun etrafında bir yoldur.
gündönümü333

4
Bu var1 = 'var1'yöntemi Groovy kullanarak bir Jenkins Pipeline'da denedim ve işe yaramadı. Ben kullanmak zorunda@Field var1 = 'var1'
retsigam

51
class Globals {
   static String ouch = "I'm global.."
}

println Globals.ouch

36
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


4

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;
    }
}

2

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?


1
değeri bir kapanış içinde atanmış olan değişkeni kullanmak istersem ne olur? Örneğin: betiğin başında def a = null var. Şimdi bir kapanmanın içine, a = 'bir dizi' değeri atanır. Bu yeni değerin diğer tüm kapanışlar için erişilebilir olmasını istiyorum. teşekkürler
OK999

Gerçekten mi?
Denemeniz

İstenilen hesaplanan değeri döndüren ve gerektiğinde bunu kullanan bir kapanış oluşturmayı
bitirdim

1

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

}

Temiz bir yaklaşım olmayabilir ama işe yarıyor;) teşekkürler.
Nicole Stutz

1
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);

0

Ne istediğini anlayamadın ama böyle bir şeye ihtiyacın var mı? :

def a = { b -> b = 1 }
bValue = a()
println b // prints 1

Şimdi bValuedeğeri bkapanışta bir değişken olan değeri içerir a. Şimdi ile her şeyi yapabilirsiniz bValueSorunuzu yanlış anladıysam haberim olsun

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.