我想覆盖的方法这样可枚举模块:红宝石覆盖可枚举法
(注意,这是一个简单的例子)。
理论上,当我拨打collect
或map
时,Ruby应该使用我的重写版本,对不对?但事实并非如此。它始终使用内置的Enumerable方法。是否因为collect
实际上是enum_collect
并且符合来源?
[1,2,3].map(&:to_s) # never prints anything
是的,我知道,猴子,修补是坏的,等等,等等,我知道有替代品,包括子类,等等,但我想知道是否有可能覆盖一个内置在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,但理想情况下,我正在寻找一种适用于所有版本的解决方案。
第一个问题是,为什么呢?为什么不写一个类,混合使用Enumerable('include Enumerable'),然后定义'each'来做你想做的事?这样*所有*可枚举的方法的行为方式,你想要的类,你可以继承,如果需要的话。 – mrlee
“我知道有其他选择,包括子类化等,但我想知道是否有可能用Ruby覆盖内置的C函数。”我想改变地图在所有Enumerable对象上的工作方式。我没有说任何关于'each'的... – sethvargo
运行这个,看看它是*全部*关于'each':https://gist.github.com/4410424。它没有具体回答你的问题,但它可以让你持续改变Enumerable行为。 – mrlee