LoginSignup
0
0

More than 3 years have passed since last update.

入れ子になったクロージャに関するGroovyの不思議な挙動

Posted at

環境

Groovy Version: 2.4.16 JVM: 11.0.4 Vendor: Ubuntu OS: Linux

現象

Sample.groovy
class Foo {
    String message
    Foo(String s) {
        message = s
    }
    String getWhat() {
        return message
    }
}

void bar(String s, Closure c) {
    c.delegate = new Foo(s)
    c.resolveStrategy = Closure.DELEGATE_FIRST
    c()
}

bar("hello", { ->
    // assert getWhat() == what // OK
    bar("bye", { ->
        // assert getWhat() == what // OK
        { ->
            assert getWhat() == what
        }()
    })
})

こういうコードを実行するとassertが失敗します。

assert getWhat() == what
       |         |  |
       hello     |  bye
                 false

考察

  • どう考えてもgetWhat()とwhatの値が違うのはおかしい
  • たぶんOWNER_FIRST(デフォルトのまま)なクロージャの挙動が間違っている
  • OWNER_FIRSTだろうがDELEGATE_FIRSTだろうがdelegate同士なら近いほうが優先されるべきだと思う(つまり"hello"が間違っていて"bye"は正しい)

一応 https://issues.apache.org/jira/projects/GROOVY/issues/ を眺めてみたけど、それっぽいものは見当たらない。まさかこれが仕様ではないと思うのですが。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0