2

问题总结

今天早上我正在使用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 -v的是Groovy Version: 2.6.0-alpha-2 JVM: 1.8.0_111 Vendor: Oracle Corporation OS: Windows 10,我在 Powershell 中以管理员权限 运行groovysh 。

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

任何解释将不胜感激

4

1 回答 1

2

这在groovysh 文档页面上进行了描述:

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

这将设置一个 shell 变量:

foo = "bar"

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

def foo = "bar"

您可以启用解释器模式来更改行为(在groovysh控制台中输入):

:set interpreterMode true
于 2018-09-01T18:54:27.410 回答