1

Groovy 1.8.6 では、次のようなことをしようとしていました。

class Greeter {
    def sayHello() {
        this.metaClass.greeting = { System.out.println "Hello!" }
        greeting()
    }
}

new Greeter().sayHello()

これはうまくいきませんでした:

groovy.lang.MissingPropertyException: No such property: greeting for class: groovy.lang.MetaClassImpl

少し試した後、self への参照をメソッドに渡すとうまくいくことがわかりました。だから、基本的に私が思いついたのはこれでした:

class Greeter {
    def sayHello(self) {
        assert this == self
        // assert this.metaClass == self.metaClass

        self.metaClass.greeting = { System.out.println "Hello!" }
        greeting()
    }
}

def greeter = new Greeter()
greeter.sayHello(greeter)

最も奇妙なことは、assert this == self実際に合格することです。つまり、それらは同じインスタンスです...そうですか?デフォルトtoStringもこれを確認しているようです。

一方、assert this.metaClass == self.metaClass失敗します:

assert this.metaClass == self.metaClass
            |         |  |    |
            |         |  |    org.codehaus.groovy.runtime.HandleMetaClass@50c69133[groovy.lang.MetaClassImpl@50c69133[class Greeter]]
            |         |  Greeter@1c66d4b3
            |         false
            groovy.lang.MetaClassImpl@50c69133[class Greeter] 

self.metaClass が HandleMetaClass にラップされているのに、this.metaClass がラップされていないのはなぜですか? また、self への参照を渡さずに最初の例を機能させるにはどうすればよいでしょうか?

4

2 に答える 2

1

私は2つの質問を見つけました:

  • groovy.lang.MissingPropertyException: そのようなプロパティはありません: クラスの挨拶: groovy.lang.MetaClassImpl

  • なぜ this.metaClass == self.metaClass

このリンクを参照してください: https://stackoverflow.com/a/45407488/42769

于 2015-12-25T13:03:12.753 に答える
0

methodMissing最後の質問に答えるために、以下のようにクラスに実装できます。

class Greeter {
    def sayHello() {
        //this.metaClass.greeting = { System.out.println "Hello!" }
        greeting()
        goodNight()
    }

    def methodMissing(String name, args){
        if(name == 'greeting'){
            println "Hello!" 
        } else
            println "Good Night"
    }
}

new Greeter().sayHello()

また==、groovyequals()では、ID を比較したい場合は、実際には (つまり、値の比較) を意味することに注意してください。次is()のように使用できます。

a.is(b) //Corresponds to == in Java
a == b //Corresponds to equals() in Java

UPDATE
以下のように metaClass を使用できます

Greeter.metaClass.greeting = { println "Hello"}
def greet = new Greeter()

//or
//greet.metaClass.greeting = { println "Hello"}

greet.sayHello()
于 2013-08-28T20:46:30.343 に答える