Câu trả lời:
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.
}
class Globals
giải pháp dưới đây là một con đường xung quanh đó.
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'
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()
ở đâ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
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;
}
}
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?
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
}
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);
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ị b
là 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 bValue
Hãy cho tôi biết nếu tôi đã hiểu nhầm câu hỏi của bạn