拿这个片段:
def line = "asdf"
String foo() {
try {
//line = "qwer"
return line
} finally {
line = "zxcv"
}
}
println line
println foo()
println line
来自 .NET 背景,我希望打印行能够产生
asdf
asdf
zxcv
然而,在 groovy 中,它会产生
asdf
zxcv
asdf
这在几个方面让我感到困惑。
1)为什么打印foo()生产的价值zxcv?我希望 return 语句能够评估line并尝试 return ,但在返回不应该影响返回值的asdfset line 之前。asdf
2)由于第二个输出是zxcv,我们必须接受该行line = "zxcv"正在执行。asdf那么,为什么要为第三个输出设置 BACK呢?
3)取消注释该line = "qwer"行产生的输出如下所示:
asdf
qwer
asdf
我认为这与任何一个模型都不一致。它看起来像一些奇怪的范围行为,但我无法弄清楚这里的规则是什么。
使用 Groovy 2.2.2
编辑:啊哈!我从 groovy 控制台运行它。看来,如果我将它包装在一个类中并运行它,程序会产生预期的输出,即:
class MyClass {
def line = "asdf"
String foo() {
try {
//line = "qwer"
return line
} finally {
line = "zxcv"
}
}
def printStuff() {
println line
println foo()
println line
}
}
new MyClass().printStuff()
生产
asdf
asdf
zxcv
我还发现了Script -> Clear Script Context菜单选项。在清除脚本上下文后立即执行原始代码段时,控制台会抛出以下异常:
asdf
Exception thrown
groovy.lang.MissingPropertyException: No such property: line for class: ConsoleScript53
at ConsoleScript53.foo(ConsoleScript53:6)
at ConsoleScript53.run(ConsoleScript53:13)
随后的运行产生不正确的输出
asdf
zxcv
asdf
有了这些新信息,GroovyConsole 中似乎有一些奇怪的东西正在提升line到它的上下文中,并返回它而不是line在顶部声明。或者其他的东西。知道这只是工具而不是语言的问题,这让我不想从我刚刚开始真正喜欢的语言中尖叫。