Точка, которую они пытаются сделать, заключается в том, что локальная переменная блока (или параметр блока) будет полностью отделена от переменной вне блока, даже если она имеет одно и то же имя, но если вы просто ссылаетесь до x
в блоке, если он не является локальной переменной блока или параметром блока, вы имеете в виду тот же x
, который существует вне блока.
Они имеют этот пример прямо над одним вы процитировать:
x = 10
5.times do |y|
x = y
puts "x inside the block: #{x}"
end
puts "x outside the block: #{x}"
Выход:
x inside the block: 0
x inside the block: 1
x inside the block: 2
x inside the block: 3
x inside the block: 4
x outside the block: 4
Обратите внимание, что это только в том случае, если вы обратитесь к x
перед блоком. Если вы удалили строку x = 10
в начале, то x
в блоке будет полностью локальным для блока и что последняя строка будет ошибочной (если у вас не был метод с именем x
в том же объекте, и в этом случае он назвал бы это метод).
Как второй пример не получает новую переменную, когда она печатает от 0 до 4 вместо от 10 до 14? – stackjlei
Я не знаю, что вы имеете в виду. Во втором примере нет вложенных переменных. 'x' является параметром блока, а не переменной. –
поэтому добавление ';' является единственным способом для области блоков получать переменные из внешней области? – stackjlei