Expandoを試してみたよ。

Groovy

2008-11-30 - プログラミング日記

Expandoとは何か - Grな日々(uehajの日記)

を参考に、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の日記)は一読が必要。

Groovy