Второй пример действителен только в том случае, если вы работаете со сценариями. См. 3.2 Script class here.
Без переменной def хранится в привязке скрипта и работает как глобальная переменная в этом скрипте.
Если вы определяете переменную с def
, она будет локальной переменной метода run
скрипта и будет следовать всем правилам локальной переменной. Эта разница не имеет большого значения, если вы работаете с одним скриптом.
Различие можно проиллюстрировать следующим фрагментом:
def closureA = { println(a) }
def closureB = { println(b) }
a = "I'm global"
def b = "I'm local"
println(a) // prints "I'm global"
println(b) // prints "I'm local"
closureA() // prints "I'm global"
closureB() // throws groovy.lang.MissingPropertyException: No such property: b
Здесь я сначала объявить 2 затворов (анонимные функции). Обратите внимание, что во время объявления не объявляется ни a
, ни b
, и поэтому недоступны для закрытия. Все нормально.
Затем я вызываю println
непосредственно после объявления, и в этом случае я в той же области с a
и b
. Я могу напечатать их ценность.
Далее я вызываю замыкания. Оба закрытия проверяют локальную область, и если переменная там не найдена, они проверяют bindings
. И вот разница: a
доступен, а b
- нет.
Чайка, спасибо! –