the ||=
operator checks first, if your value car
is already set. If car
returns nil, it will assign the first value on the right side which doesn't return nil
or false
.
So, given your example from above, if you assign a value to car like
car = "BMW"
and you execute you code-snippet, the value of car will still be "BMW";
If method_1 returns (for instance) the String "Value from Method 1"
and car is nil
or false
, then car this String will be assigned to car
car = nil
car ||= (method_1 || method_2)
car # => "Value from Method 1"
If method_1 also returns nil
/false
, it will check for the value in method_2, and so forth, until it gets some sort of true-value
The difference to your second code-snippet is, that in case of ||=
the variable car
will be evaluated first, and set if it returns nil or false.
If you use =
only, no evaluation will happen and car will be set to the first value on the right that doesn't return nil or false.
-- UPDATE --
To answer your update question, the value on the right side will be evaluated from left to right, so the first one that doesn't return nil
or false
will be assigned.
car = nil
# method_1 => "nil"
# method_2 => "false"
# method_3 => "value method 3"
# method_4 => "I won't be called"
car ||= (method_1 || method_2 || method_3 || method_4)
# => "value method 3"