2011-06-10 34 views

Trả lời

2

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

Tuy nhiên, biến toàn cầu thường được coi là biểu mẫu không hợp lệ.

Tại sao không trả lại biến từ một hàm, sau đó chuyển biến đó sang hàm khác?

+0

nếu tôi muốn sử dụng biến có giá trị đã được assig ned trong một đóng cửa? Ví dụ: tôi có def a = null ở đầu tập lệnh. Bây giờ bên trong một đó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 bao đóng khác. cảm ơn – OK999

+0

Thật sao? Bạn sẽ ghét bản thân khi bạn phải cố gắng sửa chữa nó –

+0

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

1

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

Nếu bạn đã một số phương pháp mà cần phải chia sẻ cùng một biến, sử dụng một lĩnh vực:

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

println Globals.ouch 
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ờ bValue chứa giá trị của b mà là một biến trong việc đóng cửa a. Bây giờ bạn có thể làm bất cứ điều gì với bValue Hãy cho tôi biết nếu tôi đã hiểu sai câu hỏi của bạn

131

Trong tập lệnh Groovy, phạm vi có thể khác với mong đợi. Đó là bởi vì một kịch bản Groovy trong chính 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 được thực hiện. Chúng ta có thể định nghĩa một biến được scoped cho kịch bản 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. 
} 
+2

+1 để sử dụng các công cụ mới trong Groovy 1.8: D –

+20

Chỉ cần lưu ý Field @yêu cầu nhập khẩu .. import groovy.transform.Field – khylo

+0

vui thử chỉnh sửa để thay đổi sau đó sang hơn trong dòng đầu tiên, SO muốn chỉnh sửa sáu chữ! – JimLohse

1

Tôi nghĩ bạn đang nói về các biến cấp lớp. Như đã đề cập ở trên, việc 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ỳ phương thức nào khác ngoài phương thức. ở cấp lớp với dung ra kiểu biến

ví dụ:

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

// def a or int a wont work 

a=0 

} 
+0

Nó có thể không phải là một cách tiếp cận sạch sẽ, nhưng nó hoạt động;) cảm ơn. –

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); 
2
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 iamglobal biến là một biến toàn cầu được sử dụng bởi func và sau đó một lần nữa sẵn sàng Func2

Các vấn đề liên quan