С точки зрения функциональности обе строки кода не делают одно и то же.
Да, эти два фрагмента дают одинаковые результаты.
инъекция, начинающаяся с 0, означает то же самое, что и сумма
Нет, совсем нет. На самом деле, 0
здесь не имеет значения. Вы можете опустить его и получить тот же результат.
scope_value.values.map { |i| 2** i.to_i }.inject(:|)
Операции в этих двух фрагментах очень разные. Они дают одинаковый результат только из-за особой формы ваших данных. Что означает, что «каждое число имеет только один установленный бит, и никакие два числа не могут иметь одинаковый установленный бит». Нарушьте это правило и увидите, что результаты расходятся.
Кстати, до того, как у нас было .sum
, мы использовали его для эмуляции с .inject(:+)
. Это делает то же самое (при использовании целочисленных массивов)