ฉันจะสร้างและเข้าถึงตัวแปรส่วนกลางใน Groovy ได้อย่างไร


130

ฉันต้องการเก็บค่าในตัวแปรในวิธีการหนึ่งจากนั้นฉันต้องใช้ค่านั้นจากตัวแปรนั้นในวิธีอื่นหรือปิด ฉันจะแบ่งปันค่านี้ได้อย่างไร?

คำตอบ:


208

ในสคริปต์ 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.
}

35
เพียงเพื่อทราบว่า Field @ ต้องการการนำเข้า .. import groovy.transform.Field
khylo

ตลกพยายามแก้ไขเพื่อเปลี่ยนแล้วเป็นมากกว่าในบรรทัดแรกดังนั้นจึงต้องการแก้ไขหกอักขระ!
JimLohse

1
หากคุณกำลังพยายามใช้ตัวแปรส่วนกลางจากภายในนิยามคลาสมันจะยุ่งยากเล็กน้อย class Globalsวิธีแก้ปัญหาด้านล่างเป็นวิธีการแก้ปัญหานั้น
solstice333

4
ฉันลองใช้var1 = 'var1'วิธีนี้ใน Jenkins Pipeline โดยใช้ Groovy แล้วก็ไม่ได้ผล ฉันต้องใช้@Field var1 = 'var1'
retsigam


37
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


4

เช่นเดียวกับภาษา OO อื่น ๆ Groovy ไม่มีแนวคิดเรื่อง "global" ด้วยตัวมันเอง (ซึ่งแตกต่างจากเช่น BASIC, Python หรือ Perl)

หากคุณมีหลายวิธีที่ต้องแชร์ตัวแปรเดียวกันให้ใช้ฟิลด์:

class Foo {
    def a;

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

2

เพียงแค่ประกาศตัวแปรที่ขอบเขตคลาสหรือสคริปต์จากนั้นเข้าถึงจากภายในวิธีการหรือการปิดของคุณ หากไม่มีตัวอย่างก็ยากที่จะเจาะจงมากขึ้นสำหรับปัญหาเฉพาะของคุณ

อย่างไรก็ตามตัวแปรทั่วโลกโดยทั่วไปถือว่าเป็นรูปแบบที่ไม่ดี

ทำไมไม่คืนค่าตัวแปรจากฟังก์ชันหนึ่งแล้วส่งกลับไปยังฟังก์ชันถัดไป?


1
จะเกิดอะไรขึ้นถ้าฉันต้องการใช้ตัวแปรที่มีการกำหนดค่าภายในการปิด? เช่น: ฉันมี def a = null ที่จุดเริ่มต้นของสคริปต์ ตอนนี้ค่าของ a = 'some string' ถูกกำหนด ฉันต้องการให้ค่าใหม่นี้สามารถเข้าถึงได้จากการปิดอื่น ๆ ทั้งหมด ขอบคุณ
OK999

จริงๆ? คุณจะเกลียดตัวเองเมื่อต้องพยายามแก้ไข
tim_yates

ฉันสิ้นสุดการสร้างการปิดที่ส่งคืนค่าที่คำนวณที่ต้องการและใช้ตามที่ต้องการ
OK999

1

ฉันคิดว่าคุณกำลังพูดถึงตัวแปรระดับชั้น ดังที่ได้กล่าวไว้ข้างต้นโดยใช้ตัวแปร global variable / class ไม่ใช่แนวทางปฏิบัติที่ดี

หากต้องการใช้งานจริงๆ. และหากแน่ใจว่าจะไม่มีผลกระทบ ...

ประกาศตัวแปรใด ๆ ที่ด้านข้างของวิธีการ ในระดับชั้นเรียนโดยไม่ต้องใช้ประเภทตัวแปร

เช่น:

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

// def a or int a wont work

a=0

}

อาจไม่ใช่แนวทางที่สะอาด แต่ใช้ได้ผล;) ขอบคุณ
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

คิดไม่ออกว่าต้องการอะไร แต่ต้องการอะไรแบบนี้? :

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

ตอนนี้bValueมีค่าของซึ่งเป็นตัวแปรในการปิดb aตอนนี้คุณสามารถทำอะไรก็ได้โดยแจ้งbValueให้เราทราบหากฉันเข้าใจคำถามของคุณผิด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.