Groovy を触り始めているものです。自分は、

  1. クロージャは delegate を設定することで、その delegate に対しても名前の検索を行うようになる
  2. クロージャは、その他にownerthis を持つ。ownerは、そのクロージャが定義された「クロージャないしクラス」を指し示す
  3. クロージャは、resolveStrategyClousure.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のスコープを探して outerstrを見つけてきている様子なのですが、これは一体どうしてなのでしょうか。