Скука и рутина это зло

run{}

Странное поведение выражения с if в Ruby

Первым делом код:

class A
  def foo
    :method_value
  end

  def bar
    foo = :variable_value if false
    foo
  end
end

Если мы используем локальную переменную с таким же именем как и метод, то метод перекрывается ею. В приведённом коде я ожидал возврата :method_value, т.к. мы не используем переменную foo. Метод bar возвращает nil. Забавно, правда?

Переиначил приведённый выше пример, но получил тот же результат:

class A
  def foo
    :method_value
  end

  def bar
    if false
      foo = :variable_value
    end
    foo
  end
end

Наверное эта «фича» находится в родственных связях с багом описанном в весёлом WAT видео:

1.9.2p290 :001 > a
NameError: undefined local variable or method `a' for main:Object
1.9.2p290 :002 > b
NameError: undefined local variable or method `b' for main:Object
1.9.2p290 :003 > a = b
NameError: undefined local variable or method `b' for main:Object
1.9.2p290 :004 > a
 => nil

После того как мы просто попытались использовать необъявленные переменные одна из них магическим образом объявилась.

WAT?

Comments