安全地向Array类添加`sum`方法

时间:2011-07-22 21:53:36

标签: ruby monkeypatching

我在代码中进行了大量的数组求和,所以我正在考虑对Array类进行猴子修补,以包含sum方法(对数组中的所有元素求和):

class Array
  def sum
    self.inject{ |s, t| s + t }
  end
end

但是,我以前从来没有在共享代码中修改任何东西,我怀疑这是一个“安全”的事情(例如,也许其他人已经在{{sum方法中定义了Array方法1}})。

那么能够在我正在编写的代码中对数组求和的最佳方法是什么,而不必每次都写arr.inject{ |s, t| s + t }?猴子补丁有安全的方法吗?我能以某种方式使用模块吗?或者我应该在某个地方写一个辅助方法,它接收一个数组并返回总和(即def sum_array(arr); return arr.inject{ |s, t| s + t }; end)? (或者还有其他一些方法吗?)

2 个答案:

答案 0 :(得分:5)

inject实际上可以采用符号参数,所以你真正需要编写的是arr.inject(:+),我认为它并不需要更短的形式。

http://www.ruby-doc.org/core/classes/Enumerable.html#M001494

答案 1 :(得分:3)

你总是可以将数组子类化并在那里定义它。假如你有AdderArray < Array,你可以找到这样的总和:

AdderArray.new(a1).sum

或者你可以定义一个帮助库:

ArrayHelper.sum(a1)

这取决于你该怎么做。我甚至没有看到猴子修补的问题(有人有可能制作一个名为sum的数组方法并不总和?)。即使最终发生冲突,您也可以在事后将其重命名为sum_members