Странное поведение с использованием def в groovy's repl (groovysh) - PullRequest
0 голосов
/ 01 сентября 2018

Краткое описание проблемы

Этим утром я использовал 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

Затем я попытался установить атрибут 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, и я запускаю groovysh в Powershell с правами администратора.

Я провел несколько минут исследования, чтобы лучше понять эту аномалию, но поскольку поисковые термины (groovy, def, groovysh, repl, instantiation, исключения и т. Д.) Настолько распространены, что я не смог найти ничего, что явно касалось этого поведения .

Любое объяснение будет с благодарностью

1 Ответ

0 голосов
/ 01 сентября 2018

Это описано на странице документации groovysh :

Все переменные оболочки нетипизированы (т. Е. Нет def или другой информации о типе).

Это установит переменную оболочки:

foo = "bar"

Но это оценит локальную переменную и не будет сохранено в> среде оболочки:

def foo = "bar"

Вы можете включить режим интерпретатора , чтобы изменить поведение (введите это в консоли groovysh):

:set interpreterMode true
...