我有一个对象 Results,它包含一个 result
对象数组以及一些关于数组中对象的缓存统计信息。我希望 Results 对象能够表现得像一个数组。我的第一个切入点是添加这样的方法
def <<(val)
@result_array << val
end
这感觉非常像 C,我知道 Ruby 有更好的方法。
我也希望能够做到这一点
Results.each do |result|
result.do_stuff
end
但我不确定 each
方法到底在做什么。
目前我只是通过一个方法返回底层数组并调用它的每个,这似乎不是最优雅的解决方案。
如有任何帮助,我们将不胜感激。
最佳答案
对于实现类数组方法的一般情况,是的,您必须自己实现它们。 Vava 的回答就是一个例子。但是,在您给出的情况下,您真正想做的是委托(delegate)处理 each
的任务。 (可能还有一些其他方法)到包含的数组,这可以自动化。
require 'forwardable'
class Results
include Enumerable
extend Forwardable
def_delegators :@result_array, :each, :<<
end
此类将获得 Array 的所有 Enumerable 行为以及 Array <<
运算符,它将全部通过内部数组。
请注意,当您将代码从数组继承切换到此技巧时,您的 <<
方法开始返回的不是对象本身,就像真正的 Array 的 <<
确实——这会让你在每次使用 <<
时都声明另一个变量。 .
关于ruby - 如何将 'each' 方法添加到 Ruby 对象(或者我应该扩展数组)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2080007/