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 控制台无法“记住”任何变量 - 总是说“未知属性”的主要内容,如果未能解决你的问题,请参考以下文章

访问jenkins共享库代码中的环境变量

Jenkins-pipeline 从 groovy 中的属性文件中提取和设置变量

在groovy post请求中设置标头

Jenkins 在 groovy 脚本中检索主动选择参数

GIT无法记住账户密码问题

如何在 Jenkins 中使用 Groovy 脚本设置颠覆工作区格式?