试图将数组传递给我自己的方法,例如my_inject,它与#inject做同样的事情

时间:2014-01-31 12:29:25

标签: ruby arrays

我正在尝试创建一个以数组作为参数的新方法(例如my_inject)。这种新方法应该复制注入方法的相同功能。

  

Array.inject(1){| product,n |产品* n}

注射方法:

1.累加器从0开始

2。 my_inject遍历集合

3。对每个迭代执行计算

4。然后累加器重置为结果    计算

5。下一次迭代:while循环/递归

编辑 :这可能是一个解决方案

  def my_inject(acc=0)
    array.each { |i| acc = yield(acc, i)}
    acc  
  end
end

3 个答案:

答案 0 :(得分:1)

注入方法看起来像这样:

def my_inject(my_array, accumulator)
  my_array.each do |item|
    accumulator = yield accumulator, item
  end
  accumulator 
end

此方法遍历数组,并且对于每个项目,它将当前累积值和项目本身传递给给定块。它接受返回值,并用它替换当前的累计值。

它返回数组的最后一个结果。

答案 1 :(得分:1)

如果要直接在数组上调用方法,请执行以下命令:

def my_inject(accumulator)
  self.each do |item|
    accumulator = yield accumulator, item
  end
  accumulator 
end

答案 2 :(得分:0)

说完我在一个问题上说的话 - 重新定义方法只需打开一个类并定义一个与旧方法同名的方法:

class Array
  def inject(value)       # You should never redefine method so it changes its interface/API!
    (64+value).chr
  end
end

更新后的答案

你想要的是在枚举模块上定义sum方法:

module Enumerable
  def sum
    reduce(&:+)       
  end
end

如果您正在使用rails,则它已经内置,因此您只需运行(5..10).sum即可。请注意,(5..10)不是数组而是Range,因此在Array上定义sum将不起作用。然而,在Enumerable模块(定义{{​​1}}和reduce方法)上定义它是有意义的,它包含在Array和Range中(也包含在Hash和其他几个类中)