Краткое объяснение - «обратный вызов для inject
должен принимать два аргумента». Но это, вероятно, полностью не очистит его.
ОК, так что давайте посмотрим на обычный блок формы Inject:
[1, 2, 3].inject {|memo, number| memo + number}
Передача символа работает таким же образом - он просто превращает символ в процедурный, который занимает место блока. При включении символа в процедурный, преобразование выглядит следующим образом:
class Symbol
def to_proc
proc {|receiver, *args| receiver.send(self, *args) }
end
end
Итак, когда вы проходите :+
, он вызывает метод +
значения памятки с текущим номером в качестве аргумента, так же, как 1 + 2
.
Итак, когда вы проходите :to_i
, это эквивалентно следующему:
["1", "2", "3"].inject {|memo, number_string| memo.to_i(number_string) }
Но это не имеет никакого смысла. Вы пытаетесь передать строку в качестве аргумента в to_i
. который недействителен.
В большинстве ситуаций в реальном мире вам нужно «map» вместо «inject», например. '[" 1 "," 2 "," 3 "]. Map (&: to_i) # => [1,2,3]'. –
Правда. Это был начальный шаг, прежде чем я захотел выполнить сумму, то есть преобразовать в 'to_i' и использовать' inject' для ее суммирования. – Bala
Я бы сделал оба шага в одно и то же время: '['1', '2', '3']. Reduce (0) {| sum, n | sum + n.to_i} '(обратите внимание, что' reduce' является псевдонимом для 'inject') –