Expandoを試してみたよ。
を参考に、Expandoを使ってみた。
なるほど。Groovyのオブジェクトをjavascriptっぽく使えると。これはちょっとうれしいかも。
javascript使ってると、Groovyにもオブジェクトへの動的なメソッド追加が欲しかったり感じてた。(そんなケースは滅多にないのかもしれませんが。ロジックおかしい?w)
def y = [:] y.name = "HANAKO" /* これはエラーになる。 y.greet = { you -> println "HELLO ${you.toUpperCase()}, MY NAME IS ${delegate.name}" } y.greet "taizo" */ greet = { you, name -> println "HELLO ${you.toUpperCase()}, MY NAME IS ${name}" } greet "taizo", y.name
コメントアウトした部分は実行できません。delegateは実行中のスクリプト自体を参照する模様。ここでは、ExpandoTest.groovyというファイル名でスクリプトを書いていたので、
No such property: name for class: workspace.blog.ExpandoTest
なんていうエラーになってしまう。
動的にメソッド追加したい場合には
def x = new Expando() x.name = "taro" x.greet = { you -> println "hello $you, my name is ${delegate.name}" } x.greet "genzou" def y = [:] y.name = "HANAKO"
実行結果:hello genzou, my name is taro
すごい!ほんとだ。javascriptだw。javascriptだとdelegateの部分がthisになるんだよね。これはおもしろい!
groovyにはmixinな命令はあるけど、使わなくてもこの方法でメソッド(クロージャーだけど)を別のオブジェクトにも使いまわせる。
def x = new Expando() x.name = "taro" x.greet = { you -> println "hello $you, my name is ${delegate.name}" } x.greet "genzou" def y = [:] y.name = "HANAKO" def z = new Expando() z.name = "jiro" // メソッドをいただきます♪ z.greet = x.greet z.greet "hanzo" z.greet = "chisato" // 上書きしちゃうとメソッド呼べなくなるよ。 // z.greet "misaki"
結論:やはりGrな日々(uehajの日記)は一読が必要。
ディスカッション
コメント一覧
まだ、コメントがありません