【问题标题】:Strange behavior using def in groovy's repl (groovysh)在 groovy 的 repl (groovysh) 中使用 def 的奇怪行为
【发布时间】:2018-09-01 18:37:56
【问题描述】:

问题总结

今天早上我正在使用 groovysh 来测试一个闭包,但在这样做的过程中我遇到了意外的行为,我在 groovysh 中定义了一个类,然后从中实例化了一个对象类如下

groovy:000> class Student {
groovy:001> def firstName
groovy:002> def lastName
groovy:003> }
===> true
groovy:000> def chris = new Student()
===> Student@52d239ba

然后我尝试使用隐式 setter 方法设置 firstName 属性,如下所示:

groovy:000> chris.setFirstName("chris")

并收到以下错误

Unknown property: chris

然后我尝试实例化一个没有def 的新对象,它成功执行

groovy:000> jen = new Student()
===> Student@c1bd0be
groovy:000> jen.setFirstName("Jenifer")
===> null

不明白为什么会这样,然后我创建了一个可执行的 groovy 文件(如下所示)

class Student {
    def firstName
    def lastName
}

def chris = new Student()
chris.setFirstName("Christopher")
println chris


john = new Student()
john.setFirstName("Jonathan")
println john

然后我执行脚本并收到以下输出

Student@6ab778a
Student@1dac5ef

我觉得这很奇怪,因为脚本在 groovysh 中引发了异常,但作为独立文件成功执行。

我的groovy -vGroovy Version: 2.6.0-alpha-2 JVM: 1.8.0_111 Vendor: Oracle Corporation OS: Windows 10,我在Powershell 中以管理员权限运行groovysh

我进行了几分钟的研究以更好地理解此异常,但由于搜索词(groovy、def、groovysh、repl、实例化、异常等)非常常见,我无法找到任何明确解决此行为的内容.

任何解释将不胜感激

【问题讨论】:

    标签: groovy types instantiation read-eval-print-loop groovysh


    【解决方案1】:

    这在groovyshdocumentation page上有描述:

    Shell 变量都是无类型的(即没有 def 或其他类型信息)。

    这将设置一个shell变量:

    foo = "bar"
    

    但是,这将评估一个局部变量并且不会被保存到 shell 的 >environment:

    def foo = "bar"
    

    您可以启用interpreter mode 来更改行为(在groovysh 控制台中输入):

    :set interpreterMode true
    

    【讨论】:

    • 非常感谢您的回复。如果我没看错的话,用 def 实例化的变量将无法在 shell 中进一步访问,但是用 def 初始化的类会是?他们这样做是有原因的吗?
    • @ChrisMaggiulli 我不确定我是否理解正确。我怀疑这是因为脚本的上下文和评估是如何处理的。我还没有看到它的来源,但我会假设每个命令都有自己的脚本,并且代码进入 run 方法,该方法将排除其他局部变量(并且 shell 会对没有 @ 声明的变量产生异常987654329@ 或特定数据类型)。
    • 太棒了,非常感谢您与我分享您的知识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多