重写ruby中的inject方法

时间:2013-11-25 16:43:21

标签: ruby

如何重写inject方法,但在红宝石中,基本上是

(5..10).inject { |sum, n| sum + n }  == (5..10).new_inject { |sum, n| sum + n }

评估为true。那是没有使用method_missing ...

编辑:

根据要求,这是我到目前为止所得到的:

module Enumerable
  def new_inject(&block)
    if block_given?
      a ||= self.first
      self[1..-1].each do |s|
        @result = block.call(a,s)
      end
    end
    @result
   end   
end

1 个答案:

答案 0 :(得分:3)

大多数Ruby stdlib的纯Ruby实现的优秀示例可以在Rubinius中找到;这是inject

在你的尝试中我发现了几个错误:

  1. 您没有inject的签名权,有四种变体。
  2. 您认为self responds_to :[]并非所有Enumerable已完成的承诺。
  3. 您无法在循环中更新累加器a
  4. 您应优先使用yield block.call(更快)