私は次のようにEnumerableモジュールのメソッドを上書きしようとしています:
module Enumerable
def collect(&block)
puts 'collect'
super
end
end
(これは簡単な例であることに注意してください)。
理論的には、collect
またはを呼び出すときmap
、Rubyはオーバーライドされたバージョンを使用する必要がありますよね?しかし、そうではありません。常に組み込みのEnumerableメソッドを使用します。それcollect
は実際enum_collect
にソースに準拠しているからですか?
[1,2,3].map(&:to_s) # never prints anything
はい、モンキーパッチが悪いなど、サブクラス化などの選択肢があることは承知していますが、組み込みのC関数をRubyで上書きできるかどうか知りたいです。
Enumerable.class_eval do
def collect(&block)
puts 'collect was class_eval'
super
end
end
eigen = class << Enumerable; self; end
eigen.class_eval do
def collect(&block)
puts 'collect was eigen'
super
end
end
module Enumerable
def collect(&block)
puts 'collect was opened up'
super
end
end
Array.send(:include, Enumerable)
そしてそのほとんどすべての組み合わせ。
PS。これはRuby1.9.3ですが、理想的にはすべてのバージョンで機能するソリューションを探しています。