2

次の関数について考えてみましょう。

def generateUniqueIdent(String text, uniqueSuffix = {uid -> String.valueOf(uid)}) {
   doSomething(text) + uniqueSuffix()
}

さて、次の変更を試みると:

def generateUniqueIdent(String text, uniqueSuffix = { hash(text) }) {
   doSomething(text) + uniqueSuffix()
}        

..次のエラーが発生しました:

| エラーコンパイル中の致命的なエラーorg.apache.tools.ant.BuildException:BUG!ソースユニットのフェーズ「クラス生成」の例外「ここのパス」は、スタック変数としてテキストという名前の変数を取得しようとしましたが、この名前の変数は作成されませんでした(完全なトレースを表示するには--stacktraceを使用してください)

同時に、textクロージャーのパラメーターとして名前を使用しようとすると、次のようになります。

def generateUniqueIdent(String text, uniqueSuffix = {text -> hash(text) }) {
   doSomething(text) + uniqueSuffix(text)
}     

..その後、別のエラーが発生しました:

現在のスコープには、名前テキストの変数がすでに含まれています

問題は、関数パラメーターの1つにデフォルト値として割り当てられているクロージャーから他のパラメーターにアクセスできるかどうかです。

いいえの場合、説明されているクロージャー内にある関数パラメーターの1つと同じ名前を使用できないのはなぜですか?

4

1 に答える 1

2

デフォルトのitパラメーターを使用できます。

def generateUniqueIdent(String text, uniqueSuffix = { hash(it) }) {
   doSomething(text) + uniqueSuffix(text)
}

実施例

または、クロージャー パラメーターの代わりに別の名前を使用しますtext

def generateUniqueIdent(String text, uniqueSuffix = { x -> hash(x) }) {
   doSomething(text) + uniqueSuffix(text)
}

残念ながら、この場合、クロージャーから前のパラメーターにアクセスすることうまくいっているので、元の問題が何であるかわかりません:S

于 2012-07-25T19:39:16.753 に答える