a ||= b
- это то же самое, что сказать a = b if a.nil?
или a = b unless a
Но все ли 3 варианта показывают одинаковую производительность? С Ruby 2.5.1 это
1000000.times do
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
end
занимает на моем ПК 0,099 секунды, а
1000000.times do
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
end
занимает 0,062 секунды. Это почти на 40% быстрее.
и тогда у нас также есть:
1000000.times do
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
end
, что занимает 0,166 секунды.
В общем, это не окажет существенного влияния на производительность, но если вам нужен последний бит оптимизации, рассмотрите этот результат.
Кстати: a = 1 unless a
новичку легче читать, это само за себя.
Примечание 1: причиной многократного повторения строки назначения является уменьшение накладных расходов цикла на измеренное время.
Примечание 2: Результаты аналогичны, если я делаю a=nil
ноль перед каждым назначением.