Вот что сказал мой приятель и супер-эксперт по Ruby Джош Чик:
Когда Ruby видит назначение, он инициализирует переменную в текущей области и устанавливает ее равной nil. Поскольку назначение не было выполнено, оно не обновило значение foo.
если операторы не изменяют область видимости, как блоки. Это также самое важное различие между
for x in xs
и
xs.each { |x| }
Вот еще один пример:
a = 123 if a # => nil
a # => nil
Мы не должны быть в состоянии сказать if a
, потому что мы никогда не устанавливаем a
, но Руби видит a = 123
и инициализирует a
, а затем достигает if a
, в этот момент a
равен nil
Я бы на самом деле посчитал это прихотью переводчика. Гари Бернхардт высмеивает это в вате (https://www.destroyallsoftware.com/talks/wat) с a = a
-Josh