मैं ग्रूवी में वैश्विक चर कैसे बना और एक्सेस कर सकता हूं?


128

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

जवाबों:


206

एक ग्रूवी स्क्रिप्ट में स्कोपिंग उम्मीद से अलग हो सकती है। ऐसा इसलिए है क्योंकि अपने आप में एक ग्रूवी स्क्रिप्ट एक ऐसी विधि है जो कोड को चलाएगी, लेकिन यह सब रनटाइम के अनुसार होता है। हम स्क्रिप्ट को स्कूप करने के लिए एक चर को परिभाषित कर सकते हैं या तो टाइप परिभाषा को छोड़ कर या ग्रूवी 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.
}

35
बस नोट करने के लिए फील्ड @requires a import .. import groovy.transform.Field
khylo

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

1
यदि आप एक वर्ग परिभाषा के भीतर से एक वैश्विक चर का उपयोग करने की कोशिश कर रहे हैं, तो यह थोड़ा मुश्किल हो जाता है। class Globalsनीचे समाधान है कि चारों ओर एक रास्ता है।
solstice333

4
मैंने var1 = 'var1'Groovy का उपयोग करते हुए जेनकिन्स पाइपलाइन में विधि की कोशिश की और यह काम नहीं किया। मैं का उपयोग करना था@Field var1 = 'var1'
retsigam


36
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

यदि आप के साथ चर घोषित डीईएफ़ यह, स्थानीय हो सकता है अगर आप डीईएफ़ अपनी वैश्विक का उपयोग नहीं करते


4

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

यदि आपके पास कई विधियाँ हैं जिन्हें एक ही चर को साझा करने की आवश्यकता है, तो एक फ़ील्ड का उपयोग करें:

class Foo {
    def a;

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

2

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

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

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


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

वास्तव में? जब आपको कोशिश करनी हो और इसे ठीक करना हो तो आप खुद से नफरत करेंगे
tim_yates

मैंने एक क्लोजर बनाना शुरू किया जो वांछित गणना मूल्य लौटाता है और जहां इसकी आवश्यकता है
OK999

1

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

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

किसी चर को विधि की ओर से घोषित करें। चर प्रकार के साथ वर्ग स्तर पर

उदाहरण के लिए:

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

// def a or int a wont work

a=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);

0

यह पता नहीं लगा सका कि आप क्या चाहते हैं, लेकिन आपको ऐसा कुछ चाहिए? :

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.