【发布时间】:2014-05-20 15:48:29
【问题描述】:
拿着这个sn-p:
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 并尝试返回 asdf,但在将 set line 返回到 asdf 之前,这不应该影响返回值。
2) 由于第二个输出是zxcv,我们必须接受line = "zxcv" 行正在执行。那么,为什么第三个输出会被设置回asdf?
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 菜单选项。清除脚本上下文后立即执行原来的sn -p时,控制台会抛出如下异常:
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。或者其他的东西。知道这只是工具而不是语言的问题,这让我不想从我刚刚开始真正喜欢的语言中尖叫。
【问题讨论】:
-
我无法重现这个。您能否制作一个 SSCCE 并包括您如何执行它(从命令行、在 groovy 控制台等)?
标签: groovy groovy-console