I understand the difference between || and or, or && and and, but what I don't understand is this:
Consider a method that returns the value of @var, or initializes it if @var is nil for false.
As I came from JavaScript background, I would write it like this, since || has higher precedence than =:
def some_method
@var || (@var = MyClass.new)
end
or use or, since or has lower precedence:
def some_method
@var or @var = MyClass.new
end
or more concisely:
def some_method
@var ||= MyClass.new
end
But it so happened that this version also works:
def some_method
@var || @var = MyClass.new
end
I search the web but didn't find useful results.
Most of them just tell the difference between || and or.
The operator precedence table clearly says that || has higher precedence than =.
I can even do a = b || c = d and Ruby sees it as a = (b || (c = d)).
Is this behavior documented somewhere or is it some kind of magic in Ruby?
P.S. CoffeeScript also has the same behavior.
Update / Clarification: This question is not about short-circuit evaluation. But about operator precedence. Please let me rephrase it again:
If || has higher precedence than =, then why does ruby sees a || a = b as a || (a = b), but not (a || a) = b and raise a syntax error?