Это зависит.
@x ||= value
эквивалентно
@x = @x || value
, которое присваивает value
@x
, только если @x
ложно.В Ruby только false
и nil
являются ложными.
Далее, #present?
- это концепция от Rails (см. doc ).
Обратите внимание, чтов зависимости от значения, которое вы планируете хранить в @x
, оно может быть эквивалентным.#present?
- это просто отрицание #blank?
(также концепция Rails).#blank?
определяется для Object
следующим образом:
def blank?
respond_to?(:empty?) ? !!empty? : !self
end
Таким образом, поведение двух опубликованных вами фрагментов гарантированно будет эквивалентным, когда @x
содержит значение, которое не определяет его собственноеМетоды #present?
, #blank?
или #empty?
.
Теперь FalseClass
и NilClass
оба определяют #blank?
:
def blank?
true
end
TrueClass
также определяет #blank?
:
def blank?
false
end
Но это всего лишь оптимизация, поскольку реализация по умолчанию из Object
приведет к тем же значениям.
Следовательно, false
и nil
вернут false
для #present?
, а true
вернут true
для #present?
.
Из этого мы заключаем, чтов конкретном случае хранения логических значений в @x
поведение двух фрагментов эквивалентно.