2011-06-10 73 views

答えて

2

変数をクラススコープまたはスクリプトスコープで宣言してから、メソッドまたはクロージャの内側から変数にアクセスするだけです。例がなければ、あなたの特定の問題に対してより具体的ではありません。

ただし、グローバル変数は一般的に不良フォームとみなされます。

変数を関数から戻して、それを次の関数に渡すのはなぜですか?

+0

私は値がassigである変数を使用したい場合閉鎖内でned?例:スクリプトの冒頭にdef a = nullがあります。今度はクロージャの内側にa = 'some string'という値が割り当てられます。私はこの新しい価値が他のすべての閉鎖にアクセスできるようにしたい。ありがとう – OK999

+0

本当に? –

+0

私は目的の計算値を返し、それを使用してクロージャーを作成し終わったところで、Groovy 1で新しいものを使用するのに、 – OK999

1

すべてのオブジェクト指向言語と同様に、Groovyはそれ自体で "グローバル"という概念を持っていません(BASIC、Python、Perlとは異なり)。

あなたが同じ変数を共有する必要があるいくつかの方法は、フィールドを使用している場合:

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

グロビスクリプトでは、スコープが予想外に異なる可能性があります。これはGroovyスクリプト自体がコードを実行するメソッドを持つクラスだからですが、それはすべて実行時に実行されます。型定義を省略するか、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. 
} 
+2

+1が必要です。8:D –

+20

ちょっと注意してくださいField @はインポートを必要とします。import groovy.transform.Field – khylo

+0

面白いことに、最初の行よりも変更するように編集しようとしました.SOは6文字の編集を望んでいます! – 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変数が再び使用可能FUNCその後、とによって使用されるグローバル変数であるfunc2の

関連する問題