Groovy консоль не может "запомнить" любые переменные - всегда говорит "неизвестное свойство"
В оболочке Groovy вы можете ввести команды, например
def x = 1
и запустите их. Эта строка возвращается с:
groovy:000> > def x = 1
def x = 1
===> 1
groovy:000>
Теперь, если я набираю:
println(x)
Я получаю:
groovy:000> > println(x)
println(x)
Unknown property: x
groovy:000>
Итак, похоже, что консоль или оболочка запоминают определения объектов, это нормально?
Ответы
Ответ 1
Это стандартное поведение в оболочке Groovy, не свойственное оболочке Grails. Вероятно, вы не хотите, чтобы переменная def
. См. Следующее:
~ $ groovysh
Groovy Shell (2.3.4, JVM: 1.7.0_45)
Type ':help' or ':h' for help.
-------------------------------------------------------------------------------
groovy:000> def x = 42
===> 42
groovy:000> x
Unknown property: x
groovy:000> y = 2112
===> 2112
groovy:000> y
===> 2112
groovy:000>
От http://beta.groovy-lang.org/groovysh.html
1.3.4. Переменные
Оболочки Shell все нетипизированы (т.е. no def
или другая информация о типе).
Это установит переменную оболочки:
foo = "bar"
Но это будет оценивать локальную переменную и будет не сохранено в среде оболочки:
def foo = "bar"
Вы можете изменить это поведение, включив interpreterMode
groovy:000> := interpreterMode
groovy:000> def x = 42
===> 42
groovy:000> x
===> 42
groovy:000>
Ответ 2
"def" больше похожи на скомпилированные переменные в Java-способе (в некоторой степени), скомпилированные (возможно, тип неизвестен/динамичен, но известно имя/существование переменной/свойства).
def xyz = 1
→ Object xyz = 1;
Без "def" добавляются в конкретный контейнер Binder по имени, полностью динамическим образом. Представьте себе это как конкретную карту (извините за простоту)
binder["xyz"] = 1;
Мое личное наполнение заключается в том, что Groovy doc не иллюстрируют эту (огромную) разницу. Слово "нетипизированное" кажется слабым.
Реализация "хранения" для этих двух полностью отличается.