2011-06-10 19 views
67

मुझे एक विधि में एक वैरिएबल में एक मान को स्टोर करने की आवश्यकता है और फिर मुझे उस वैरिएबल से उस वैल्यू को किसी अन्य विधि या क्लोजर में उपयोग करने की आवश्यकता है। मैं इस मूल्य को कैसे साझा कर सकता हूं?मैं ग्रोवी में वैश्विक चर कैसे बना सकता हूं और एक्सेस कर सकता हूं?

उत्तर

2

बस वर्ग या स्क्रिप्ट स्कोप पर चर घोषित करें, फिर इसे अपने तरीकों या बंदियों के अंदर से एक्सेस करें। उदाहरण के बिना, हालांकि आपकी विशेष समस्या के लिए और अधिक विशिष्ट होना मुश्किल है।

हालांकि, वैश्विक चर को आम तौर पर खराब रूप माना जाता है।

वैरिएबल को एक फ़ंक्शन से वापस क्यों न करें, फिर इसे अगले में पास करें?

+0

क्या होगा यदि मैं वेरिएबल का उपयोग करना चाहता हूं जिसका मूल्य assig किया गया है एक बंद के भीतर ned? उदा।: मैंने स्क्रिप्ट की शुरुआत में एक = शून्य खो दिया है। अब अंदर एक बंद, एक = 'कुछ स्ट्रिंग' का मान असाइन किया गया है। मैं चाहता हूं कि यह नया मूल्य अन्य सभी बंदियों तक पहुंच योग्य हो। धन्यवाद – OK999

+0

वास्तव में? जब आप इसे –

+0

को आजमाकर ठीक करना चाहते हैं तो आप खुद से नफरत करेंगे, मैंने एक बंद करने का अंत किया है जो वांछित गणना मूल्य लौटाता है और इसका उपयोग उस ग्रोवी 1 में नई सामग्री का उपयोग करने के लिए – OK999

1

सभी ओओ भाषाओं की तरह, ग्रोवी के पास "वैश्विक" की कोई अवधारणा नहीं है (विपरीत, कहें, बेसिक, पायथन या पर्ल)।

आप कई तरीकों का एक ही चर साझा करने की आवश्यकता है कि एक क्षेत्र का उपयोग किया है, तो:

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

println Globals.ouch 
0

समझ नहीं सका कि आप क्या चाहते हैं, लेकिन आप कुछ इस तरह की जरूरत है? :

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

अब bValue जो बंद a में एक चर है b का मान है। अब आप bValue के साथ कुछ भी कर सकते हैं मुझे बताएं कि क्या मैंने आपके प्रश्न को गलत समझा है

131

ग्रोवी लिपि में स्कोपिंग अपेक्षा से अलग हो सकती है। ऐसा इसलिए है क्योंकि एक ग्रोवी स्क्रिप्ट एक ऐसी विधि है जिसमें कोड चलाया जाएगा, लेकिन यह सब रनटाइम किया जाता है। हम प्रकार परिभाषा को छोड़कर या ग्रोवी 1.8 में स्क्रिप्ट पर स्केल किए जाने के लिए एक चर को परिभाषित कर सकते हैं, हम @ फ़ील्ड एनोटेशन जोड़ सकते हैं।

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 की आवश्यकता है।8: डी –

+20

बस फ़ील्ड @ नोटक्वॉयर को आयात करने के लिए .. आयात groovy.transform.Field – khylo

+0

मजाकिया पहली पंक्ति की तुलना में बदलने के लिए संपादित करने की कोशिश की, तो एसओ एक छः-चार संपादन चाहता है! – JimLohse

1

मुझे लगता है कि आप कक्षा स्तर चर के बारे में बात कर रहे हैं। वैश्विक चर/वर्ग स्तर चर का उपयोग कर ऊपर वर्णित अनुसार एक अच्छा अभ्यास नहीं है।

यदि आप वास्तव में इसका उपयोग करना चाहते हैं। और यदि आप सुनिश्चित हैं कि प्रभाव नहीं होगा ...

विधि के बाहर किसी भी चरणीय घोषित करें। बाहर चर प्रकार के साथ श्रेणी स्तर पर

जैसे:

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

// def a or int a wont work 

a=0 

} 
+0

यह एक साफ दृष्टिकोण नहीं हो सकता है, लेकिन यह काम करता है;) धन्यवाद। –

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() 
यहाँ

iamglobal चर एक वैश्विक समारोह और फिर से इस्तेमाल किया चर फिर से उपलब्ध है func2 को

संबंधित मुद्दे