为什么有些方法可以使用注入,有些方法可以使用?

时间:2014-06-10 19:18:31

标签: ruby

我知道我可以将方法传递给inject。例如,

[1,2,3].inject(:+)     #=> 6

但是这个抛出

["1","2","3"].inject(:to_i) #=> TypeError: no implicit conversion of String into Integer
["1","2","3"].inject(:to_s) #=> ArgumentError: wrong number of arguments (1 for 0)

我没有做任何特别的事情,只是想让我的基础知识正确。

1 个答案:

答案 0 :(得分:5)

简短的解释是“inject的回调必须采取两个论点。”但这可能不会完全清除它。

好的,让我们看一下普通的注入块形式:

[1, 2, 3].inject {|memo, number| memo + number}

传递符号的方式相同 - 它只是将符号转换为代替块的proc。将符号转换为proc时,转换如下所示:

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。这是无效的。