ruby - 为什么有些方法可以与 inject 一起使用而有些则不行?

标签 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)

我没有做任何特别的事情,只是想把我的基础做好。

最佳答案

简短的解释是“inject 的回调必须有两个参数。”但这可能不会完全清除它。

好的,让我们看看注入(inject)的正常 block 形式:

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

传递一个符号的方式相同——它只是将符号变成一个代替 block 的过程。当你把一个符号变成一个过程时,转换看起来像这样:

class Symbol
  def to_proc
    proc {|receiver, *args| receiver.send(self, *args) }
  end
end

所以当你传递:+时,它会以当前数字为参数调用memo值的+方法,就像1 + 2.

所以当你传递:to_i时,它等价于这样:

["1", "2", "3"].inject {|memo, number_string| memo.to_i(number_string) }

但这没有任何意义。您正在尝试将字符串作为参数传递给 to_i。这是无效的。

关于ruby - 为什么有些方法可以与 inject 一起使用而有些则不行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24149217/

相关文章:

ruby - 将哈希合并为稀疏矩阵的高效算法

ruby-on-rails - 验证时区在 Rails 中是否有效

ruby - 使用 Ruby Net::HTTP 的 curl 任务

ruby-on-rails - 在没有自动保存的情况下为 Activerecord 模型分配关联

ruby-on-rails - Welcome#index 中没有方法错误

ruby - 在 Ruby 中对字符串数组进行排序

mysql - 仅清除单个表的 Rake 任务

ruby - 如何从 Ruby 中的数组中获取第一个、第二个和第五个元素?

ruby-on-rails - 获取嵌套哈希的键/值对

Ruby 不同的行为取决于 block 类型