Подтвердить что ты не робот

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> 

Итак, похоже, что консоль или оболочка запоминают определения объектов, это нормально?

4b9b3361

Ответ 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 = 1Object xyz = 1;

Без "def" добавляются в конкретный контейнер Binder по имени, полностью динамическим образом. Представьте себе это как конкретную карту (извините за простоту)

binder["xyz"] = 1;

Мое личное наполнение заключается в том, что Groovy doc не иллюстрируют эту (огромную) разницу. Слово "нетипизированное" кажется слабым. Реализация "хранения" для этих двух полностью отличается.