I’ve blogged about this in the past, but I’m bringing it back here because I think it’s fascinating:

coolvar = 42 if false
coolvar # nil

I had seen someone bring up an interesting point, that this seemed natural to them. It was because they had read the above statement as:

temp = 42 if false
coolvar = temp

and then it would only make sense that coolvar have a value. That doesn’t jive with me though, and it shouldn’t jive with you. That would mess up precedence, treating if, more like the precedence of rescue.

Just to demonstrate that isn’t the case, let’s go for another example:

if false
  coolvar
end
coolvar # NameError

Uh-oh!!! Now we’re in trouble, you say. We just parsed some code that included a variable and even after parsing it, the variable was still undefined. The precedence is clear here, and the behavior isn’t happening.

Thing is - it’s all about Ruby trying to figure out what coolvar is. In fact, let’s go even further - in Ruby, all undefined local variables are nil. When you type coolvar, Ruby just can’t tell if coolvar is a method or a local variable. So you get a NameError. If you do something that demonstrates to Ruby that it’s a local variable - then when it gets parsed, you can access it and it’s value will be nil. Check it out:

if false
  coolvar = 'yup'
end
coolvar # nil

Hope this helps clear up things!