我正在尝试覆盖 Enumerable 模块上的方法,如下所示:
module Enumerable
def collect(&block)
puts 'collect'
super
end
end
(注意这是一个简单的例子)。
理论上,当我调用collect
or时map
,Ruby 应该使用我覆盖的版本,对吗?但事实并非如此。它总是使用内置的 Enumerable 方法。是不是因为collect
实际上是enum_collect
遵从源头的?
[1,2,3].map(&:to_s) # never prints anything
是的,我知道 Monkey-Patching 很糟糕,等等等等,我知道还有其他选择,包括子类化等,但我想知道是否可以用 Ruby 覆盖内置的 C 函数。
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。这是 Ruby 1.9.3,但理想情况下,我正在寻找一种适用于所有版本的解决方案。