Почему ruby ​​определяет переменные, даже если он никогда не выполняет код присваивания переменной? - PullRequest
3 голосов
/ 10 июня 2019

Учитывая следующий код:

a = true # let's assign `a` a value

# and let's test if calling `b`, an unassigned variable, throws an error
begin
  puts "The value of b is: #{b.inspect}"
rescue NameError => e
  puts "Caught an error: #{e}"
end

a || b = true # the assignment should never be executed because `a` is `true`

puts "The value of b is: #{b.inspect}" # will calling `b` still raise an error?

Мы получаем следующий результат:

Caught an error: undefined local variable or method `b' for main:Object
The value of b is: nil

Даже если мы ожидаем, что вызов b вызовет ошибку во второй раз, мы увидимчто b сейчас, фактически, nil.

Почему это так?Почему b получает назначение nil?Поскольку || никогда не достигал назначения, я ожидал, что b останется неопределенным.Как это можно определить, но не присвоить значение?

1 Ответ

5 голосов
/ 10 июня 2019

Некоторые из документов объясняют, как создаются переменные;Насколько я понимаю, объяснение состоит в том, что именно так работает синтаксический анализатор:

Локальная переменная создается, когда синтаксический анализатор встречает назначение, а не когда происходит назначение:

a = 0 if false # does not assign to a
p local_variables # prints [:a]
p a # prints nil

Вы можете увидеть другие примеры этого:

b = true if false # b is nil
"test" || c = true # c is nil

И другие, которым не назначено:

puts d if false # d generates a NameError
...