Операторы присваивания в недоступных ветвях кода действительно влияют на локальные переменные.
class Foo
def method_missing(meth, *args)
"returned from method_missing #{meth}"
end
end
Foo.new.instance_exec do
puts abc.inspect # abc is considered a method
if true == false
abc = 1 # <-- this should never be reached
end
puts abc.inspect # abc is considered a local variable
end
Это выводит:
"returned from method_missing abc" # <- the return value from method_missing
nil # <- suddenly abc is nil, even though abc wasn't touched.
Итак, Ruby видит код, который присваивается локальной переменной abc
и решает, что с этого момента abc
является переменной, а не вызовом метода.
Я считаю, что это сделано для того, чтобы разрешить что-то подобное без NoMethodError
:
if something
a = true
end
if a
puts "ah yes, a."
end
Это редко встречается, если вы сначала не делаете глупостей.