0

このページの最後の例 ( http://groovy.codehaus.org/JN3525-MetaClasses ) では、metaClass の invokeMethod 呼び出しをオーバーライドするクロージャ コードが「デリゲート」を参照しています。コードも以下にコピーされます。

class Bird{
  def name= 'Tweety'
  def twirp(){ 'i taught i saw a puddy cat' }
}
Bird.metaClass.invokeMethod= {name, args->
  def metaMethod= Bird.metaClass.getMetaMethod(name, args) 
        //'getMetaMethod' gets method, which may be an added or an existing one
  metaMethod? metaMethod.invoke(delegate,args): 'no such method'
}
def a= new Bird()
assert a.twirp() == 'i taught i saw a puddy cat'
assert a.bleet() == 'no such method'

Bird.metaClass.getProperty= {name->
  def metaProperty= Bird.metaClass.getMetaProperty(name) 
    //'getMetaProperty' gets property, which may be an added or an existing one
  metaProperty? metaProperty.getProperty(delegate): 'no such property'
}
def b= new Bird()
assert b.name == 'Tweety'
assert b.filling == 'no such property'

デリゲートは正確にはどこから来ており、それは何を参照していますか?

Bird クラスを参照しているように見えますが、これは Groovy クロージャーと言語全体の実装にどのように適合するのでしょうか?

4

1 に答える 1

2

Bird クラスを参照しているように見えますが、これは Groovy クロージャーと言語全体の実装にどのように適合するのでしょうか?

上記に答えるために、のインスタンスを参照しますBird。operatorと同様に機能thisしますが、 で示されるラップされたオブジェクトのコンテキスト外thisです。これは、小さな例で説明できます。

Integer.metaClass.sayHello = {
    return "Say hello $delegate times"
}

assert 2.sayHello() == "Say hello 2 times" 
assert 20.sayHello() == "Say hello 20 times" 


Integer.metaClass.sayHi = {
    return "Say hello $this times"
}

println 2.sayHi()

Groovy コンソールで実行している場合は、最後の println をマークします。thisoperator は、上記のコードを実行するスクリプトを表します。

上記の説明に加えて、私のコメントで提供されているリンクにアクセスしてください。

于 2013-07-09T19:29:34.883 に答える