在groovy的repl(groovysh)中使用def产生奇怪的行为

时间:2018-09-01 18:37:57

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

问题摘要

今天早晨,我正在使用 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

我做了几分钟的研究以更好地理解此异常,但是由于搜索词(常规,def,常规,重复,实例化,异常等)非常普遍,因此我找不到任何明确解决此问题的方法

任何解释将不胜感激

1 个答案:

答案 0 :(得分:2)

这在groovysh documentation page上有描述:

  

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

     

这将设置一个shell变量:

foo = "bar"
     

但是,这将评估局部变量,并且不会保存到外壳的>环境中:

def foo = "bar"

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

:set interpreterMode true