我想覆蓋的方法這樣可枚舉模塊:紅寶石覆蓋可枚舉法
(注意,這是一個簡單的例子)。
理論上,當我撥打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