Làm cách nào để tạo và truy cập các biến toàn cục trong Groovy?


128

Tôi cần lưu trữ một giá trị trong một biến trong một phương thức và sau đó tôi cần sử dụng giá trị đó từ biến đó trong một phương thức khác hoặc đóng. Làm thế nào tôi có thể chia sẻ giá trị này?

Câu trả lời:


206

Trong một kịch bản Groovy, phạm vi có thể khác với dự kiến. Đó là bởi vì một tập lệnh Groovy tự nó là một lớp với một phương thức sẽ chạy mã, nhưng đó là tất cả thời gian chạy. Chúng ta có thể định nghĩa một biến được đặt trong phạm vi tập lệnh bằng cách bỏ qua định nghĩa kiểu hoặc trong Groovy 1.8, chúng ta có thể thêm chú thích @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.
}

35
Chỉ cần lưu ý Trường @ yêu cầu nhập .. nhập Groovy.transform.Field
khylo

buồn cười đã cố gắng chỉnh sửa để thay đổi sau đó thành dòng đầu tiên, SO muốn chỉnh sửa sáu char!
JimLohse

1
nếu bạn đang cố gắng sử dụng một biến toàn cục từ trong một định nghĩa lớp, nó sẽ hơi phức tạp. Các class Globalsgiải pháp dưới đây là một con đường xung quanh đó.
solstice333 ngày

4
Tôi đã thử var1 = 'var1'phương pháp trong Đường ống Jenkins bằng Groovy và nó không hoạt động. Tôi đã phải sử dụng@Field var1 = 'var1'
retsigam


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()

ở đây biến iamglobal là biến toàn cục được sử dụng bởi func và sau đó lại có sẵn cho func2

nếu bạn khai báo biến với def thì nó sẽ là cục bộ, nếu bạn không sử dụng def toàn cầu


4

Giống như tất cả các ngôn ngữ OO, Groovy không có khái niệm "toàn cầu" (không giống như BASIC, Python hoặc Perl).

Nếu bạn có một số phương thức cần chia sẻ cùng một biến, hãy sử dụng một trường:

class Foo {
    def a;

    def foo() {
        a = 1;
    }
    def bar() {
        print a;
    }
}

2

Chỉ cần khai báo biến ở phạm vi lớp hoặc tập lệnh, sau đó truy cập nó từ bên trong các phương thức hoặc các bao đóng của bạn. Nếu không có ví dụ, thật khó để cụ thể hơn cho vấn đề cụ thể của bạn.

Tuy nhiên, các biến toàn cầu thường được coi là hình thức xấu.

Tại sao không trả về biến từ một hàm, sau đó chuyển nó sang hàm tiếp theo?


1
Điều gì xảy ra nếu tôi muốn sử dụng biến có giá trị đã được chỉ định trong một bao đóng? Ví dụ: tôi có def a = null ở đầu tập lệnh. Bây giờ, bên trong một bao đóng, giá trị của a = 'một số chuỗi', được gán. Tôi muốn giá trị mới này có thể truy cập được đối với tất cả các lần đóng cửa khác. cảm ơn
OK999

Có thật không? Bạn sẽ ghét chính mình khi bạn phải thử và sửa nó
tim_yates

Tôi đã kết thúc việc tạo một bao đóng trả về giá trị tính toán mong muốn và sử dụng giá trị cần thiết
OK999

1

Tôi nghĩ rằng bạn đang nói về các biến cấp lớp. Như đã đề cập ở trên sử dụng biến toàn cục / biến cấp lớp không phải là một thực hành tốt.

Nếu bạn thực sự muốn sử dụng nó. và nếu bạn chắc chắn rằng sẽ không có tác động ...

Khai báo bất kỳ biến ra bên ngoài phương thức. ở cấp lớp với loại biến

ví dụ:

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

// def a or int a wont work

a=0

}

Nó có thể không phải là một cách tiếp cận sạch, nhưng nó hoạt động;) cảm ơn.
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

Không thể tìm ra những gì bạn muốn, nhưng bạn cần một cái gì đó như thế này? :

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

Bây giờ bValuechứa giá trị blà một biến trong bao đóng a. Bây giờ bạn có thể làm bất cứ điều gì với bValueHãy cho tôi biết nếu tôi đã hiểu nhầm câu hỏi của bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.