ฉันต้องการเก็บค่าในตัวแปรในวิธีการหนึ่งจากนั้นฉันต้องใช้ค่านั้นจากตัวแปรนั้นในวิธีอื่นหรือปิด ฉันจะแบ่งปันค่านี้ได้อย่างไร?
ฉันต้องการเก็บค่าในตัวแปรในวิธีการหนึ่งจากนั้นฉันต้องใช้ค่านั้นจากตัวแปรนั้นในวิธีอื่นหรือปิด ฉันจะแบ่งปันค่านี้ได้อย่างไร?
คำตอบ:
ในสคริปต์ Groovy ขอบเขตอาจแตกต่างจากที่คาดไว้ นั่นเป็นเพราะสคริปต์ Groovy ในตัวมันเองเป็นคลาสที่มีเมธอดที่จะรันโค้ด แต่นั่นคือรันไทม์ทั้งหมด เราสามารถกำหนดตัวแปรที่จะกำหนดขอบเขตให้กับสคริปต์ได้โดยการละเว้น type definition หรือใน Groovy 1.8 เราสามารถเพิ่มคำอธิบายประกอบ @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
วิธีแก้ปัญหาด้านล่างเป็นวิธีการแก้ปัญหานั้น
var1 = 'var1'
วิธีนี้ใน Jenkins Pipeline โดยใช้ Groovy แล้วก็ไม่ได้ผล ฉันต้องใช้@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()
ที่นี่ตัวแปรiamglobalเป็นตัวแปรส่วนกลางที่func ใช้แล้วมีให้อีกครั้งในfunc2
ถ้าคุณประกาศตัวแปรด้วยdefมันจะเป็นแบบโลคัลถ้าคุณไม่ใช้ def มัน global
เช่นเดียวกับภาษา OO อื่น ๆ Groovy ไม่มีแนวคิดเรื่อง "global" ด้วยตัวมันเอง (ซึ่งแตกต่างจากเช่น BASIC, Python หรือ Perl)
หากคุณมีหลายวิธีที่ต้องแชร์ตัวแปรเดียวกันให้ใช้ฟิลด์:
class Foo {
def a;
def foo() {
a = 1;
}
def bar() {
print a;
}
}
เพียงแค่ประกาศตัวแปรที่ขอบเขตคลาสหรือสคริปต์จากนั้นเข้าถึงจากภายในวิธีการหรือการปิดของคุณ หากไม่มีตัวอย่างก็ยากที่จะเจาะจงมากขึ้นสำหรับปัญหาเฉพาะของคุณ
อย่างไรก็ตามตัวแปรทั่วโลกโดยทั่วไปถือว่าเป็นรูปแบบที่ไม่ดี
ทำไมไม่คืนค่าตัวแปรจากฟังก์ชันหนึ่งแล้วส่งกลับไปยังฟังก์ชันถัดไป?
ฉันคิดว่าคุณกำลังพูดถึงตัวแปรระดับชั้น ดังที่ได้กล่าวไว้ข้างต้นโดยใช้ตัวแปร global variable / class ไม่ใช่แนวทางปฏิบัติที่ดี
หากต้องการใช้งานจริงๆ. และหากแน่ใจว่าจะไม่มีผลกระทบ ...
ประกาศตัวแปรใด ๆ ที่ด้านข้างของวิธีการ ในระดับชั้นเรียนโดยไม่ต้องใช้ประเภทตัวแปร
เช่น:
{
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);
คิดไม่ออกว่าต้องการอะไร แต่ต้องการอะไรแบบนี้? :
def a = { b -> b = 1 }
bValue = a()
println b // prints 1
ตอนนี้bValue
มีค่าของซึ่งเป็นตัวแปรในการปิดb
a
ตอนนี้คุณสามารถทำอะไรก็ได้โดยแจ้งbValue
ให้เราทราบหากฉันเข้าใจคำถามของคุณผิด