2017-12-27 9 views
1

を働いていない私は私のDemo.groovyファイルに次のコードスニペットを持ってGroovyのクロージャDELEGATE_ONLYとDELEGATE_FIRST戦略が

class Person { 
    String name 
} 
def name='no name' 
def p = new Person(name:'Igor') 
def cl = { name.toUpperCase() } 
cl.resolveStrategy = Closure.DELEGATE_ONLY 
cl.delegate = p 
println cl() 

閉鎖戦略http://groovy-lang.org/closures.html

にGroovyのドキュメントによると、私は次の出力

を期待

IGOR

ただし、コードが印刷されているようです。

いいえ

解決戦略がDELEGATE_ONLYに設定されているため、IGORではなくNAMEをgroovyで印刷するのはなぜですか?

答えて

0

ドキュメントは言う:

閉鎖で、プロパティが明示的にレシーバ・オブジェクトを設定せずにアクセスしたときはいつでも、その後、委任戦略は

を関与しているこれはあなたのケースではありません例では、変数nameが定義されています。それを削除するか、closereの定義の後に移動して、結果が表示されます。

class Person { 
    String name 
} 
def p = new Person(name:'Igor') 
def cl = { name.toUpperCase() } 
def name='no name' 
cl.resolveStrategy = Closure.DELEGATE_ONLY 

cl.delegate = p 
println cl() 

IGOR 
+0

こんにちは、「受信者オブジェクトを明示的に設定せずにプロパティにアクセスする」ということを教えてください。私はプロパティ名のレシーバオブジェクトをどこに設定していますか? –

+0

@RameshKP申し訳ありませんができません。これは私の解釈とテストの結果で簡単でした。クロージャの定義時に 'name'が定義されていなかった場合、期待通りに機能しました。しかし、このサイトには多くのGroovyエキスパートがいますので、これが解決されることを願っています。 –

+0

実際にあなたは正しいです:)実際にdef nameはクロージャの定義を下げるべきです。 –