6

私が正しく尋ねているかどうかはわかりませんが、次のようなものがあります。

def x = 1    
if (x == 1) {
   def answer = "yes"
   }
   println answer

エラーが表示されます - No such property: answer for class...

ただし、これは機能します。

def x = 1
def answer = ''
if (x==1) {
   answer = "yes"
   }
   println answer

これは、変数が If ステートメント内にあるときにローカル スコープを持っているためですか? これをコーディングするより良い方法はありますか?それとも、最初に If ステートメントの外側ですべての変数を宣言する必要があるだけですか?

4

3 に答える 3

5

これがスクリプトの場合、@ 0lukasz0が言うことは、次のように100%真実ではありません。

def x = 1
if( x == 1 ) {
  // answer is previously undefined -- note no `def`
  answer = "yes"
}
println answer

変数answerが現在のスクリプトのバインディングに入るときにも機能するため(前に変数がないdefため)、ブロックの外側からアクセスできますif(上記のスクリプトは印刷されますyes

于 2012-06-07T14:34:35.677 に答える
5

はい、変数を外部スコープで宣言する必要があります。

Principle #1: "A variable is only visible in the block it is defined in 
and in nested blocks".

スコープの詳細:http: //groovy.codehaus.org/Scoping+and+the+Semantics+of+%22def%22

于 2012-06-07T13:59:50.910 に答える
2

条件演算子を使用して、このような変数を初期化できます。

def x = 1    
def answer = x == 1? "yes" : null
println answer

初期化する変数が複数ある場合、Groovyは複数の割り当てもサポートします。

def (i, j, k) = x == 1? [ 1, 2, 3 ] : []
println "$i $j $k"
于 2012-06-07T23:28:49.603 に答える