2

これは、順序で各メソッドをオーバーロードするに投稿された質問に似ていますが、関連するすべての列挙可能なメソッドを再定義せずにサポートしたいという違いがあります。

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]

eachを再定義しても、collectが再定義されいないようです!

4

1 に答える 1

0

また、比較演算子 ( <=>) をオーバーライドして、同じ順序付けを返すようにする必要がありinclude Enumerableます。クラスでも同様です。

于 2012-01-30T14:42:21.550 に答える