Bagaimana cara membuat dan mengakses variabel global di Groovy?

128

Saya perlu menyimpan nilai dalam variabel dalam satu metode dan kemudian saya perlu menggunakan nilai itu dari variabel itu di metode atau penutupan lain. Bagaimana saya bisa membagikan nilai ini?

srini
sumber

Jawaban:

207

Dalam skrip Groovy, cakupannya bisa berbeda dari yang diharapkan. Itu karena skrip Groovy itu sendiri adalah kelas dengan metode yang akan menjalankan kode, tetapi itu semua dilakukan runtime. Kita dapat mendefinisikan variabel untuk dicakup ke skrip dengan menghilangkan definisi tipe atau di Groovy 1.8 kita dapat menambahkan anotasi @Field.

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.
}
mrhaki
sumber
35
Hanya untuk mencatat Field @memerlukan impor .. import groovy.transform.Field
khylo
lucu mencoba mengedit untuk mengubah lalu ke dari pada baris pertama, JADI ingin edit enam karakter!
JimLohse
1
jika Anda mencoba menggunakan variabel global dari dalam definisi kelas, itu menjadi sedikit rumit. The class Globalssolusi di bawah ini adalah cara di sekitar itu.
solstice333
4
Saya mencoba var1 = 'var1'metode di Jenkins Pipeline menggunakan Groovy dan tidak berhasil. Saya harus menggunakan@Field var1 = 'var1'
retsigam
51
class Globals {
   static String ouch = "I'm global.."
}

println Globals.ouch
Bob Herrmann
sumber
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()

di sini variabel iamglobal adalah variabel global yang digunakan oleh func dan kemudian tersedia lagi untuk func2

jika Anda mendeklarasikan variabel dengan def itu akan menjadi lokal, jika Anda tidak menggunakan def globalnya

Gaurav khurana
sumber
4

Seperti semua bahasa OO, Groovy tidak memiliki konsep "global" dengan sendirinya (tidak seperti, katakanlah, BASIC, Python atau Perl).

Jika Anda memiliki beberapa metode yang perlu membagikan variabel yang sama, gunakan kolom:

class Foo {
    def a;

    def foo() {
        a = 1;
    }
    def bar() {
        print a;
    }
}
Aaron Digulla
sumber
2

Cukup deklarasikan variabel di kelas atau skrip skop, lalu akses dari dalam metode atau closure Anda. Tanpa contoh, sulit untuk lebih spesifik untuk masalah khusus Anda.

Namun, variabel global umumnya dianggap bentuk yang buruk.

Mengapa tidak mengembalikan variabel dari satu fungsi, lalu meneruskannya ke fungsi berikutnya?

tim_yates
sumber
1
bagaimana jika saya ingin menggunakan variabel yang nilainya telah ditetapkan dalam closure? Misalnya: saya memiliki def a = null di awal skrip. Sekarang di dalam closure, nilai a = 'some string', diberikan. Saya ingin nilai baru ini dapat diakses oleh semua penutupan lainnya. terima kasih
OK999
Betulkah? Anda akan membenci diri sendiri ketika Anda harus mencoba dan memperbaikinya
tim_yates
Saya akhirnya membuat penutupan yang mengembalikan nilai terhitung yang diinginkan dan menggunakannya di tempat yang diperlukan
OK999
1

Saya pikir Anda berbicara tentang variabel tingkat kelas. Seperti disebutkan di atas, menggunakan variabel global / variabel tingkat kelas bukanlah praktik yang baik.

Jika Anda benar-benar ingin menggunakannya. dan jika Anda yakin tidak akan ada dampak ...

Deklarasikan variabel apa pun di luar metode. di tingkat kelas tanpa tipe variabel

misalnya:

{
   method()
   {
      a=10
      print(a)
   }

// def a or int a wont work

a=0

}
Pruthvi Minchinadka
sumber
Ini mungkin bukan pendekatan yang bersih, tetapi berhasil;) terima kasih.
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);
Bae Cheol Shin
sumber
0

Tidak dapat menemukan apa yang Anda inginkan, tetapi Anda membutuhkan sesuatu seperti ini? :

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

Sekarang bValueberisi nilai byang merupakan variabel di closure a. Sekarang Anda dapat melakukan apa saja dengan bValueBeri tahu saya jika saya salah memahami pertanyaan Anda

Semut
sumber