如何重载***每个***以建立所需的排序

时间:2012-01-30 12:36:46

标签: ruby each overloading enumerator

这类似于Overload each method with order中发布的问题,但不同之处在于我希望在不重新定义的情况下支持所有相关的可枚举方法。

使用mixin,如何覆盖 每个 以及enumerable提供的所有相关方法,而无需重新定义每个方法。例如:

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 :(得分:0)

您还需要覆盖比较运算符(<=>)以使其返回相同的顺序,并且还需要在您的班级中include Enumerable