Локальные переменные являются локальными для области, в которой они определены. Вот почему они все-таки называются «локальными» переменными.
В Ruby имеется четыре области локальных переменных: сценарий, определение модуля/класса, метод и блок/λ-литерал. Из этих четырех гнезд только блочные области, и только блоки могут быть замыканиями.
Итак, если вы определяете локальную переменную в блоке, она локальна для этого блока. Если, однако, вы определяете локальную переменную вне блока, то она будет доступна в блоке (если явно не объявлено как локальная переменная блока), поскольку область блока гнездится внутри внешней области. Он будет даже доступен в блоке после окончания внешнего диапазона, потому что области блоков закрываются вокруг их окружающей лексической среды.
Примечание: даже если for
/in
итераторы desugar в сообщение для each
с блоком, в этом специальном случае блок не получает свою область применения. Еще одна причина избежать for
/in
.
foo = :outerfoo
bar = :outerbar
[nil].each do |*; bar|
foo = :innerfoo
bar = :innerbar
baz = :innerbaz
end
foo #=> :innerfoo
bar #=> :outerbar
baz # NameError: undefined local variable or method `baz' for main:Object
for * in [nil]
looks_local_but_isnt = :huh
end
looks_local_but_isnt #=> :huh
Спасибо. Я удивлен, что никогда раньше не сталкивался с этим. Надеюсь, это урок. Думаю, я не использую блоки таким образом очень часто или объявлял переменную по какой-то другой причине. Теперь моя глобальная переменная исчезла. – Greg