Ответ 1
Если вы укажете вместо этого символ, то каждый элемент в коллекции будет передан названному методу memo
Таким образом, указание символа эквивалентно передаче следующего блока:
{|memo, a| memo.send(sym, a)}
Если вы явно не указали начальное значение для memo, то в качестве начального значения memo используется первый элемент коллекции.
Итак, нет никакой магии, Ruby просто берет первый элемент в качестве начального значения и начинает впрыскивать из второго элемента. Вы можете проверить это, написав [].inject(:+)
: он возвращает nil
в отличие от [].inject(0, :+)
, который возвращает 0.
Изменить: я не заметил амперсанда. Вам это не нужно, inject
будет работать с символом. Но если вы его напишете, символ преобразуется в блок, он может быть полезен с помощью других методов