2008-12-02 30 views
8

你如何檢查猴子補丁已經完成了Ruby中的特定類?如果這是可能的,是否也可以獲得已修補的屬性的先前實現?您如何檢測到Ruby中發生了猴子修補?

+0

可能與我:http://stackoverflow.com/questions/175655/how-to-find-where-a-ruby-method-is-defined-at-runtime - 如果有人知道這一點,請讓我知道! – 2008-12-02 21:39:00

回答

3

我發現這篇博客文章涉及如何使用method_added來跟蹤猴子修補。將其擴展到跟蹤修補的方法並不難。

http://hedonismbot.wordpress.com/2008/11/27/monkey-business-2/

通過使用公開課,我們可以重新定義爲method_added Class的實例和方法的任何類中定義的每個時間做一些定製的東西。在這個例子中,我們正在重新定義method_added,以便跟蹤上次定義方法的位置。

#!/usr/bin/env ruby                                       

class Class 
    @@method_history = {} 

    def self.method_history 
     return @@method_history 
    end 

    def method_added(method_name) 
     puts "#{method_name} added to #{self}" 
     @@method_history[self] ||= {} 
     @@method_history[self][method_name] = caller 
    end 

    def method_defined_in(method_name) 
     return @@method_history[self][method_name] 
    end 
end 
8

有鉤子method_addedmethod_undefined。 Garry Dolley寫了一個I mmutable module,可以防止猴子打補丁。