你如何检测Ruby中的猴子补丁?

时间:2008-12-02 21:30:45

标签: ruby metaprogramming

如何检查已经对Ruby中的特定类进行了猴子修补?如果可能的话,是否也可以获得已修补的属性的先前实现?

2 个答案:

答案 0 :(得分:8)

有钩子method_addedmethod_undefined。 Garry Dolley编写了一个I mmutable module来阻止猴子修补。

答案 1 :(得分:4)

我发现此博客文章涉及如何使用method_added来跟踪猴子修补。扩展它以跟踪修补的方法并不太难。

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

  

通过使用开放类,我们可以为Class的实例重新定义method_added,并在每次为任何类定义方法时执行一些自定义的东西。在这个例子中,我们重新定义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