【发布时间】:2013-09-02 18:06:37
【问题描述】:
我有一个类 game,其中包含一些自定义对象数组(恐龙、cacemen 等),这些对象由不同的访问器返回,例如 game.dinosaurs、game.cavemen 等。
目前,所有这些访问器都只是返回内部存储的数组。但现在我想为这些访问器返回的这些数组添加一些自定义迭代方法,以便能够编写类似于each_element 和each_attr 中的LibXML::XML::Node 迭代器的代码,例如game.dinosaurs.each_carnivore { ... } 等。但是从我的访问器 game.dinosaurs 和 game.cavemen 返回的对象仍然必须表现得像数组。
这样的事情通常在 Ruby 中是如何完成的?
我应该让访问器返回的对象成为一些从 Ruby 的Array 类派生的自定义类吗?或者也许我应该只创建一个带有Enumerable 的自定义类?
我知道我可以在我的集合外部使用map 或select,但我想在内部封装这些迭代,以便我的班级的用户无需费心如何设置迭代以仅从中选择食肉恐龙内部数组。
编辑:我不是在问如何使用迭代器或如何实现它们,而是如何将一些自定义迭代器添加到以前只是普通数组的对象(并且仍然需要)。
【问题讨论】:
-
我认为Practical Object-Oriented Design in Ruby,第 8 章准确地解决了您的问题,尽管它提供了一些选项,但没有解决方案适合所有情况。您应该阅读这本书(很好!),看看哪种想法适合您的项目。
标签: ruby arrays collections each extend