Подтвердить что ты не робот

Как работает "(1..4).inject(&: +)" в Ruby

Я нахожу этот код в Ruby довольно интригующим

(1..4).inject(&:+)

Хорошо, я знаю, что делает inject, и я знаю, что этот код в основном эквивалентен

(1..4).inject(0) {|a,n| a + n}

но как именно он работает?

Почему &:+ совпадает с записью блока {|a,n| a + n}?

Почему он не требует начального значения? Я в порядке с значением inicial 0, но (1..4).inject(&:*) также работает, и там начальное значение должно быть 1...

4b9b3361

Ответ 1

От Документация Ruby:

Если вы укажете вместо этого символ, то каждый элемент в коллекции будет передан названному методу memo

Таким образом, указание символа эквивалентно передаче следующего блока: {|memo, a| memo.send(sym, a)}

Если вы явно не указали начальное значение для memo, то в качестве начального значения memo используется первый элемент коллекции.

Итак, нет никакой магии, Ruby просто берет первый элемент в качестве начального значения и начинает впрыскивать из второго элемента. Вы можете проверить это, написав [].inject(:+): он возвращает nil в отличие от [].inject(0, :+), который возвращает 0.

Изменить: я не заметил амперсанда. Вам это не нужно, inject будет работать с символом. Но если вы его напишете, символ преобразуется в блок, он может быть полезен с помощью других методов