Как перегрузить *** каждый ***, чтобы установить желаемый порядок - PullRequest
2 голосов
/ 30 января 2012

Это похоже на вопрос, опубликованный в Перегрузите каждый метод порядком , но с той разницей, что я хотел бы, чтобы все связанные перечислимые методы поддерживались без переопределения.

Используя миксин, как мне переопределить каждый и все связанные методы, предоставляемые перечислимым, без переопределения каждого из них. Например:

module Ordering
   def self.included base
       base.class_eval do
           alias_method :old_each,:each

           def each *args,&block
               reverse.old_each(*args,&block) # sample: just reverse std order
           end
       end
   end
end

class OrderedArray < Array
   include Ordering
end

a=OrderedArray.new [1,2,3]
a.each{|_| p _} # works nicely
p a.collect     # fails!

генерирует:

3
2
1
[1, 2, 3]

Переопределение каждый , кажется, не переопределено сбор!

1 Ответ

0 голосов
/ 30 января 2012

Вам также необходимо переопределить оператор сравнения (<=>), чтобы он возвращал тот же порядок, а также include Enumerable в вашем классе.

...