Цитирование ресурс here:
В A = A || b, a задается чем-то по инструкции на каждом прогоне, , тогда как с || a = b, a устанавливается только в том случае, если a логически ложно (т. е. , если оно равно нулю или false), поскольку || «короткое замыкание». То есть, если с левой стороны от || сравнение верно, нет необходимости в проверить правую сторону.
Это в основном означает, что они будут вести себя аналогично вам, разработчику, но внутренне реализации отличаются, как объяснялось выше.
EDIT: Как указано в комментариях, выше объяснение считает a || a = b
вместо a ||= b
. Очень хорошая точка и прочтение этой же ссылки поясняет следующее:
Если a не определено, то || a = 42 вызывает NameError, а значение || = 42 возвращает 42. Таким образом, они не кажутся эквивалентными выражениями.
Итак, опять же, они не то же самое утверждение, потому что Руби выделяет переменную в тот момент он видит назначение на синтаксического анализа времени (которое в случае a ||= 42
).
Один последняя цитата, так что вы не думаете, что я выдумываю, :)
Рубина видит назначение на этапе синтаксического разбора и создает переменную таким образом, что он не будет с a || a = 42, даже если он заканчивается , который ведет себя как последний после фактического выполнения.
Насколько я знаю, два выражения будут иметь одинаковый результат для любого значения 'var'? Не могли бы вы добавить цитату из книги на свой вопрос, чтобы указать, что означает автор? :-) – Drenmi
Я думаю, что это всего лишь два способа написать одно и то же выражение. – Atri
Вы, ребята, классные. Спасибо – gates