2017-01-15 2 views
2

Изучение блоков Ruby here. Какой смысл иметь локальную переменную блока в этом примере: enter image description hereКакова цель установки локальных переменных блока Ruby, когда блоки уже имеют собственную область?

Когда вы можете просто сделать ниже, вместо этого? В блоке x уже будет свой собственный объем, который отличается от x, который находится за пределами блока.

ответ

6

Блока прицелы гнезда в их лексической области видимости:

foo = :outerfoo 
bar = :outerbar 

1.times do |;bar| 
    foo = :innerfoo 
    bar = :innerbar 
    baz = :innerbaz 
end 

foo #=> :innerfoo 
bar #=> :outerbar 
baz # NameError 

Вам нужен способ, чтобы сказать Руби: «Я не хочу это переменный из внешней области, я хочу новый.» Это то, что делают локальные переменные блока.

+0

Как второй пример не получает новую переменную, когда она печатает от 0 до 4 вместо от 10 до 14? – stackjlei

+0

Я не знаю, что вы имеете в виду. Во втором примере нет вложенных переменных. 'x' является параметром блока, а не переменной. –

+0

поэтому добавление ';' является единственным способом для области блоков получать переменные из внешней области? – stackjlei

0

Приведенные выше примеры учат вас об областях блоков и о том, как внутренние области могут заглушать внешние области (ваша переменная x). Дело в том, что вы должны осознавать различия.

+0

Кажется, что блок всегда будет отключать внешнюю область, глядя на пример 2. Вот почему я спрашиваю, что является примером примера 1 – stackjlei

2

Точка, которую они пытаются сделать, заключается в том, что локальная переменная блока (или параметр блока) будет полностью отделена от переменной вне блока, даже если она имеет одно и то же имя, но если вы просто ссылаетесь до 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

извините, мой второй пример раньше был неправильным, пожалуйста, взгляните еще раз на это. x внутри блока не относится к внешнему x, а к новой стороне.поэтому зачем вам нужно использовать ';' специально в первом примере, чтобы объявить локальную переменную, если она уже локальна без ';'? – stackjlei

+0

В вашем втором примере «x» - это параметр блока, который также имеет отдельную область. Но если это не параметр блока или локальная переменная блока (обратите внимание, что это просто 'y' между трубами в примере, который я скопировал со страницы), тогда' x' внутри блока ссылается на внешнюю область. Я отредактирую, чтобы отметить, что это верно для обоих параметров блока и блокировки локальных переменных. – Max

Смежные вопросы