Groovy 控制台无法“记住”任何变量 - 总是说“未知属性”
Posted
技术标签:
【中文标题】Groovy 控制台无法“记住”任何变量 - 总是说“未知属性”【英文标题】:Groovy console can't "remember" any variables - always says "unknown property" 【发布时间】:2014-12-30 06:31:22 【问题描述】:在 Groovy shell 中,您可以输入命令,例如
def x = 1
并运行它们。该行返回:
groovy:000> > def x = 1
def x = 1
===> 1
groovy:000>
现在如果我输入:
println(x)
我明白了:
groovy:000> > println(x)
println(x)
Unknown property: x
groovy:000>
看来控制台和shell都记得对象定义,这正常吗?
【问题讨论】:
【参考方案1】:这是 Groovy shell 中的标准行为,不是 Grails shell 特有的。您可能不想def
变量。请参阅以下内容:
~ $ groovysh
Groovy Shell (2.3.4, JVM: 1.7.0_45)
Type ':help' or ':h' for help.
-------------------------------------------------------------------------------
groovy:000> def x = 42
===> 42
groovy:000> x
Unknown property: x
groovy:000> y = 2112
===> 2112
groovy:000> y
===> 2112
groovy:000>
来自http://beta.groovy-lang.org/groovysh.html
1.3.4。变量
Shell 变量全部无类型(即没有
def
或其他类型信息)。这将设置一个shell变量:
foo = "bar"
但是,这将评估一个局部变量,并且将不会保存到 shell 的环境中:
def foo = "bar"
您可以通过启用interpreterMode来更改此行为
groovy:000> := interpreterMode
groovy:000> def x = 42
===> 42
groovy:000> x
===> 42
groovy:000>
【讨论】:
哇,这真是令人困惑。为什么以标准 java 方式声明类型,或以 grails 方式使用 def 在控制台中失败,但在应用程序中失败?我花了一个小时搜索展示如何使用控制台的示例,包括浏览我的 6 本 groovy 和 gails 书籍,但没有一个条目。你是怎么解决这个问题的? “你是怎么做这个的?” - 我解决了这个问题,因为我在 Groovy 和 Grails 团队中并且熟悉它的工作原理。 我意识到,当人们找到此答案时,该链接将来可能不是一个好的链接,因此我应该在此处包含更多信息。上面链接的文档目前对def'd
变量进行了以下说明...“...这将评估一个局部变量,并且不会保存到 shell 的环境中。”
这是一个很棒的链接!它拥有我想要的一切——不错的。
:= interpreterMode
完美解决了这个问题!!谢谢!!!【参考方案2】:
“def”更像是Java方式的编译变量(在某种程度上),编译(可能类型未知/动态,但变量/属性的名称/存在是已知的)。
def xyz = 1
-> Object xyz = 1;
如果没有“def”,则以完全动态的方式将名称添加到特定容器 Binder。想象一下这就像特定的地图(为简单起见)
binder["xyz"] = 1;
我个人的看法是,Groovy 文档没有清楚地说明这个(巨大的)差异。 “未键入”一词似乎很弱。 这两者的“存储”实现是完全不同的。
【讨论】:
以上是关于Groovy 控制台无法“记住”任何变量 - 总是说“未知属性”的主要内容,如果未能解决你的问题,请参考以下文章