a ||= b
ведет себя как a || a = b
.
Присвоение возвращает присвоенное значение, т.е. var = true
возвращает true
.
var ||= true
будет соответствовать присвоению var = true
, потому что var
не определено в этой точке. Если определено var
и его значение равно true
, будет возвращено значение var
, то есть true
; если оно ложно, он вернет значение true
, то есть true
.
var ||= []
возвращает []
, и ваше первое выражение оценивается как [] << 1
, что является законным.
Однако ваше второе выражение оценивается как true = false
, что приводит к ошибке компиляции.
Т.Л., др
(var ||= []) << 1
⟺ (var = []) << 1
⟺ [] << 1
✔
(var ||= true) = false
⟺ (var = true) = false
⟺ true = false
✘