我在代码中进行了大量的数组求和,所以我正在考虑对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
)? (或者还有其他一些方法吗?)
答案 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
。