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

Rea*_*nly 8 ruby metaprogramming

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

use*_*011 8

有钩子method_addedmethod_undefined.Garry Dolley编写了一个I mmutable模块,可以防止猴子修补.


Rea*_*nly 4

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

\n\n

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

\n\n
\n

通过使用开放类,我们可以为 Class 的实例重新定义 method_added ,并在每次为任何类定义方法时执行一些自定义操作。在此示例中,我们\xe2\x80\x99重新定义method_added,以便它跟踪该方法最后定义的位置。

\n\n
#!/usr/bin/env ruby                                                                                                                                                           \n\nclass Class\n    @@method_history = {}\n\n    def self.method_history\n        return @@method_history\n    end\n\n   def method_added(method_name)\n       puts "#{method_name} added to #{self}"\n       @@method_history[self] ||= {}\n       @@method_history[self][method_name] = caller\n   end\n\n   def method_defined_in(method_name)\n       return @@method_history[self][method_name]\n   end\nend\n
Run Code Online (Sandbox Code Playgroud)\n
\n