Как мне обернуть массив определенным подклассом Enumerator?

Я создал подкласс 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.

Какой правильный способ сделать это?

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 в #new, Перечислитель подклассов.

Другие вопросы по тегам