如何用 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 的特定子类包装数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何用特定键对数组值求和[重复]

如何用随机数组元素替换文本?

如何用 HOC 包装每个导出的组件?

如何用 Cython 包装 C++ 类?

如何用边框(阴影)包装 UICollectionView 部分和项目?

如何用外部容器包装手风琴?