環境
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/ を眺めてみたけど、それっぽいものは見当たらない。まさかこれが仕様ではないと思うのですが。