重写 Ruby 注入

Rewriting Ruby Inject

这是一个脑筋急转弯。

我正在尝试重写 Ruby 注入方法。我已经做到了以下。

class Array

  def injector(input = nil)

    if input == nil
      num = self.first
    else
      num = input
    end
    self[0..-1].each do |x|
      num = yield(num, x)
    end
    return num
  end
end

它正在通过一些测试,但并不完全准确,例如;

[1,2,3,4,5].injector(0) {|x,y| x + y} #=> 14

与预期输出15相反,是舍入误差吗?我似乎无法弄清楚这个

Additional example (above updated [0..-1]):

[9,8,7,6,5].injector {|x,y| x * y} #=> 136080

Ruby .inject 输出 15120

起始索引很重要,因为它取决于您的输入。

class Array

  def injector(input = nil)
    if input.nil?
      start = 1
      num = self.first
    else
      start = 0
      num = input
    end
    self[start..-1].each do |x|
      num = yield(num, x)
    end

    return num
  end

end

使用nil作为默认值可能是错误的,我应该可以将nil作为默认值传入。

class Array
  def injector(memo = (i=1; first))
    (i||0).upto(length-1) { |i| memo = yield memo, self[i] }
    memo
  end
end

[1,2,3,4,5].injector(1) { |sum, n| sum + n }
[1,2,3,4,5].injector(0) { |sum, n| sum + n }
[1,2,3,4,5].injector    { |sum, n| sum + n }

[1,2,3].injector(2) { |product, n| product * n }
[1,2,3].injector(1) { |product, n| product * n }
[1,2,3].injector    { |product, n| product * n }

['b', 'c', 'd'].injector('a') { |str, char| str + char } # => "abcd"
['b', 'c', 'd'].injector      { |str, char| str + char } # => "bcd"

seen = []
[1].injector(nil) { |prev, crnt| seen << prev << crnt }
seen # => [nil, 1]