Properties 自动属性getter、局部变量和闭包之间的Groovy冲突?

Properties 自动属性getter、局部变量和闭包之间的Groovy冲突?,properties,groovy,closures,Properties,Groovy,Closures,Groovy似乎有一些与“Groovy bean”和闭包相关的非常不愉快的行为,这些行为可能导致它在某些情况下屏蔽局部变量 这种行为是已知的吗?是否有详细的文档?我浪费了很多时间试图找出什么不起作用 考虑以下代码: class测试类{ def doIt(关闭){ closure.setDelegate(this) closure.call() } def getRevision(){ 返回“testclass修订版” } } def testIt(){ def revision=“testit

Groovy似乎有一些与“Groovy bean”和闭包相关的非常不愉快的行为,这些行为可能导致它在某些情况下屏蔽局部变量

这种行为是已知的吗?是否有详细的文档?我浪费了很多时间试图找出什么不起作用

考虑以下代码:

class测试类{
def doIt(关闭){
closure.setDelegate(this)
closure.call()
}
def getRevision(){
返回“testclass修订版”
}
}
def testIt(){
def revision=“testit revision”
println“1:+修订版+(预期:测试版)
TestClass tester=新的TestClass()
测试员{
println“2:+getRevision()+(预期:testclass)
}
println“3:+修订版+(预期:测试版)
测试员{
println“4:+修订版+(预期:测试版)
revision=getRevision()
println“5:+修订+(预期:testclass)
println“6:${getRevision()}(预期为:testclass)”
println“7:+getRevision()+(预期:testclass)
}
//预期在上一个闭包中已设置为testclass值
println“8:+修订版+(预期:testclass)
测试员{
println“9:${getRevision()}(预期为:testclass)”
println“10:+getRevision()+(预期:testclass)
}
println“11:+修订+(预期:testclass)
}
testIt()
运行此代码将生成以下输出:

1: testit revision (expect: testit)
2: testclass revision (expect: testclass)
3: testit revision (expect: testit)
4: testit revision (expect: testit)
5: testit revision (expect: testclass)
6: testit revision (expect: testclass)
7: testit revision (expect: testclass)
8: testit revision (expect: testclass)
9: testclass revision (expect: testclass)
10: testclass revision (expect: testclass)
11: testit revision (expect: testclass)
我的主要问题是5/6/7。似乎在闭包中简单地使用本地
revision
变量“隐藏”委托中的
getRevision()
方法,并将其替换为自动生成的bean样式
getRevision()
,以匹配
revision
“属性”。如果我不使用
revision
变量,那么对
getRevision()
的调用不会调用此bean行为


如有任何见解或文档链接,将不胜感激

可用于控制解析顺序的Groovy闭包。默认策略是从“拥有”对象中查找属性,并且仅当在那里找不到属性时才使用委托。我相信将此设置为将获得您期望的行为。

谢谢您的回复。我试过你的建议,但不幸的是没有用。我认为这里的问题是在编译时:在闭包中同时使用
revision
getRevision()
使groovy编译器认为它必须为
revision
变量生成一个getter,然后隐藏委托的版本。