拿这个片段:
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 ,但在返回不应该影响返回值的asdf
set 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
在顶部声明。或者其他的东西。知道这只是工具而不是语言的问题,这让我不想从我刚刚开始真正喜欢的语言中尖叫。