groovy のクロージャにおける、名前の解決がわからない(delegateを指定した場合の owner の挙動について)
Groovy を触り始めているものです。自分は、
- クロージャは
delegate
を設定することで、そのdelegate
に対しても名前の検索を行うようになる - クロージャは、その他に
owner
とthis
を持つ。owner
は、そのクロージャが定義された「クロージャないしクラス」を指し示す - クロージャは、
resolveStrategy
をClousure.DELEGATE_ONLY
に設定することで、owner
への探索を抑制することができる
と理解しているのですが、次のコードを実行すると、自分の期待とは違う挙動をしています。
class MyClass {
def outerClosure = {
def str = "outer"
def nestedClosure = {
println "delegate: ${delegate.class.name}"
println "owner: ${owner.class.name}"
println "this: ${this.class.name}"
println "resolveStrategy: ${resolveStrategy}"
println "Closure.DELEGATE_ONLY: ${Closure.DELEGATE_ONLY}"
println(str)
}
nestedClosure
}
}
class Hoge {
def str = "hoge"
}
myObj = new MyClass()
hoge = new Hoge()
def nestedClosure = myObj.outerClosure()
nestedClosure.delegate = hoge
nestedClosure.resolveStrategy = Closure.DELEGATE_ONLY
nestedClosure()
出力:
delegate: Hoge
owner: MyClass$_closure1
this: MyClass
resolveStrategy: 3
Closure.DELEGATE_ONLY: 3
outer
というのも、 DELEGATE_ONLY
にもかかわらず、owner
のスコープを探して outer
のstr
を見つけてきている様子なのですが、これは一体どうしてなのでしょうか。