[Talking-Ruby] Double Pipe (||) Or Equals (=) in Ruby
a ||= b VS a = a || b VS a || a = b, Double Pipe (||) Or Equals (=) in Ruby
A common misconception is that
a ||= b is equivalent to
a = a || b, but it behaves like
a || a = b
a = a || b, a is set to something by the statement on every run, whereas with
a || a = b, a is only set if a is logically
false (i.e. if it’s
false) because || is ‘short circuiting’. That is, if the left hand side of the
|| comparison is
true, there’s no need to check the right hand side.
Do not confuse
[op]= with anything related to
&&=. They’re entirely different ideas and are implemented entirely different.
Undefined Variables Tricky Case
a is not defined,
a || a = 42 raises
a ||= 42 returns
42. So, they don’t seem to be equivalent expressions.
a || a = 42 # NameError (undefined local variable or method `a' for main:Object)
Even though the first line won’t be run, x will exist on the second line and no exception will be raised
x = 10 if 2 == 5
Ruby sees the assignment at the parsing stage and creates the variable in a way.
x = x
 http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html - http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html