[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
In 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 nil or 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 ||= or &&=. They’re entirely different ideas and are implemented entirely different.
Undefined Variables Tricky Case
If a is not defined, a || a = 42 raises NameError, while a ||= 42 returns 42. So, they don’t seem to be equivalent expressions.
1 | 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
1 | x = 10 if 2 == 5 |
Ruby sees the assignment at the parsing stage and creates the variable in a way.
1 | x = x |