如何用 Enumerator 的特定子类包装数组?
Posted
技术标签:
【中文标题】如何用 Enumerator 的特定子类包装数组?【英文标题】:How do I wrap an array with a specific subclass of Enumerator? 【发布时间】:2013-11-19 14:05:45 【问题描述】:我创建了一个具有一些特殊属性的 Enumerator 子类(即它知道它的元素是 Time 对象):
class TimedEnumerator < Enumerator
...some time-specific methods...
end
给定一个 Time 对象数组,如何生成 TimedEnumerator?我的第一个想法是简单地使用 ::new 方法,但这会产生弃用警告:
>> TimedEnumerator.new(array)
(irb):12: warning: Enumerator.new without a block is deprecated; use Object#to_enum
当然,array.to_enum
创建的是 Enumerator 对象,而不是 TimedEnumerator 对象。
这样做的正确方法是什么?
【问题讨论】:
一般来说,我会完全避免这种情况,因为您需要覆盖核心Object
方法。我认为更简单的方法是将枚举器包装在一个装饰器类中,该装饰器类实现了特定于时间的方法,但仍将标准行为委托给枚举器。
@ZachKemp:“完全避免这种情况”,我假设您的意思是修改 .to_enum?我同意。不知道你所说的“更简单的方法”是什么意思。有例子吗?
【参考方案1】:
我可以这样做 Enumerator 的子类:
class TimedEnumerator < Enumerator
def initialize(array)
super() do |array|
#your logic
end
end
end
TimedEnumerator.new(array)
#=> <TimedEnumerator: #<Enumerator::Generator:0x007ff4cb89a9f0>:each>
从这里找到super()
技巧:ArgumentError in #new, Subclassing Enumerator。
【讨论】:
请注意,我想做的只是相当于TimedEnumerator.new(array)
,但没有弃用警告。我不想在 .new 方法中对数组进行操作,我只是希望它包含在我的 Enumerator 子类中。以上是关于如何用 Enumerator 的特定子类包装数组?的主要内容,如果未能解决你的问题,请参考以下文章