8

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

4

2 回答 2

8

有钩子method_addedmethod_undefined。Garry Dolley 编写了一个 I不可变模块来防止猴子修补。

于 2008-12-02T23:14:22.967 回答
4

我发现这篇博客文章涉及如何使用 method_add 来跟踪猴子补丁。扩展它以跟踪已修补的方法并不难。

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

通过使用开放类,我们可以为 Class 的实例重新定义 method_add ,并在每次为任何类定义方法时做一些自定义的事情。在此示例中,我们重新定义了 method_add 以便它跟踪上次定义该方法的位置。

#!/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
于 2008-12-03T05:40:21.207 回答