Странное поведение с использованием def в groovy's repl (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
Затем я попытался установить атрибут 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 ответ
Это описано на groovysh
страница документации:
Переменные оболочки все нетипизированы (т. Е. Нет данных def или другой информации)
Это установит переменную оболочки:
foo = "bar"
Но это оценит локальную переменную и не будет сохранено в> окружении оболочки:
def foo = "bar"
Вы можете включить режим интерпретатора, чтобы изменить поведение (введите это в groovysh
приставка):
:set interpreterMode true