0

次の例は、本 Groovy in Action (2007) のリスト 7.22 からのものです。

def boxer = new Expando()
assert null == boxer.takeThis
boxer.takeThis = 'ouch!'
assert 'ouch!' == boxer.takeThis
boxer.fightBack = {times -> return this.takeThis * times }
assert 'ouch!ouch!ouch!' == boxer.fightBack(3)

コードを script に入れましたhello.groovy。実行すると、次のエラーが発生しました。

Caught: groovy.lang.MissingPropertyException: No such property: takeThis for class: hello
groovy.lang.MissingPropertyException: No such property: takeThis for class: hello
    at hello$_run_closure1.doCall(hello.groovy:5)
    at hello.run(hello.groovy:6)

どうやら、this5行目はboxerオブジェクトではなくスクリプトを参照しています。fightBackでは、プロパティを Expandoに追加する正しい方法は何boxerですか?

4

1 に答える 1

4

に置き換えthisますdelegate

this(あなたが述べたように)スクリプトをdelegate参照し、クロージャーが呼び出される呼び出し元を参照します。

thisと の使用方法の違いdelegateowner ここで確認できます。

于 2013-09-01T00:37:32.933 に答える