If I execute this ruby code:
def foo
100
end
p defined?(foo), foo
if false
foo = 200
end
p defined?(foo), foo
The output I get is:
"method"
100
"local-variable"
nil
Can someone explain to me why foo is set to nil after not executing the if? Is this expected behavior or a ruby bug?
Names on the left hand side of assignments get set to
nil, even if the code can’t be reached as in theif falsecase.When Ruby tries to resolve barewords, it first looks for local variables (there’s a reference to that in the Pickaxe book, which I can’t seem to find at the moment). Since you now have one called
fooit displaysnil. As Mischa noted, the method still can be called asfoo().