ищет a
если a
является truthy, возвращает a
, в противном случае a = b
делается то присвоить значение b
«s к a
.
a = a || b
Это операция присваивания. Здесь вы присваиваете значение a
независимо от того, какое значение оно имеет. Таким образом, a
равно a || b
. Во второй части отчета вы ищете a
. Если его значение является правдивым, вы назначаете его обратно на a
, иначе вы назначаете b
значение a
.
TL; DR
a = a || b
является присвоение значения (в зависимости от состояния) к a
независимо от того, какое значение она имеет.
a ||= b
возвращение a
если уже есть, то еще делает a = b
Объясняя с примером:
Вы можете думать о a || a = b
, как a || (a = b)
. Теперь давайте предположим, что a = 4
и b = 6
.
Так как по порядку приоритета, это операция ИЛИ и поскольку порядок операций для или слева направо, мы начинаем с первым a
:
# lets call this Fig. 1
a || (a = b)
^
|
.
(here)
Это a
имеет значение 4, который представляет собой truthy значения , Поэтому оценка останавливается тогда и там, и возвращается 4
. (Почему Подсказка:true || anything = true
)
Теперь предположим a = nil
и b = 6
. Мы снова начинаем с того же места (рис.1). Так как a
- nil
, что ложно в Ruby, мы перемещаемся вправо от операции ИЛИ, т.е.a = b
# lets call this Fig. 2
a || (a = b)
^
|
.
(here)
Поскольку это операция присваивания, то будут выполнены, и мы в конечном итоге назначая 6
к a
.
Возврат к a = a || b
. Вы можете считать это a = (a || b)
. Очевидно, что по порядку приоритета - операция присвоения. Так как порядок операций для присваивания справа налево, сначала оценивается (a || b)
.
# lets call this Fig. 3
a = (a || b)
^
|
.
(here)
Если a = 4
и b = 6
, a || b
будет возвращать 4
(как обсуждалось выше). Иначе, если a = nil
и b = 6
, a || b
вернется 6
.
Теперь любое значение возвращается из этого ||
операция получает присвоенную первой a
.
# lets call this Fig. 4
a = (a || b)
^
|
.
(here)
может прочитать [эту статью] (http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html). 'a || a = b', 'a = a || b' и 'a || = b', все немного отличаются по своей природе. – Oka