Локальная переменная доступна вне блока - PullRequest
1 голос
/ 12 октября 2019

Я читаю о области действия ruby, и в ней говорится, что локальные переменные недоступны за пределами блока, в котором они определены.

Например, в примере ниже. b не должен быть доступен за пределами блока if

a = 3
    while a<10 do
        if a<5
            b= 3
        end
        a+=1
    end
puts b

Но по какой-то причине я могу получить доступ к b за пределами блока, который был определен в

1 Ответ

4 голосов
/ 12 октября 2019

В Ruby «блок» - это код, заключенный в do...end или в фигурные скобки. (Существуют и другие способы - в некотором роде - создавать блоки в Ruby, но это определение будет держать вас довольно долго.) if...end не считается блоком. Ни один не while...end. Чтобы еще больше усложнить проблему, do, который вы добавляете после while, также не делает его блоком;Руби просто услужливо игнорирует это.

Кэри уже объяснил это в комментариях, но я посмотрю, смогу ли я немного прояснить это для вас. Я немного упросту и уберу ваш код:

a = 3
while a < 10
  b = a * 3 
  a += 1
end
puts b

Это даст 27. Но теперь, если я сделаю это:

a = 3
loop do
  b = a * 3
  a += 1
  break if a == 10
end
puts b

Я получу это:

undefined local variable or method `b' for main:Object (NameError)

что вы и ожидали. Это потому, что while является утверждением. while...end может содержать несколько строк кода, но он не считается блоком. (То же самое для if.) Но на самом деле loop - это метод, который принимает блок в качестве аргумента, поэтому применяются правила области видимости, которые Кэри описывает в своем комментарии.

...