您如何检测到 Ruby 中发生了猴子补丁?

Posted

技术标签:

【中文标题】您如何检测到 Ruby 中发生了猴子补丁?【英文标题】:How do you detect that monkey patching has occurred in Ruby? 【发布时间】:2010-09-25 00:46:51 【问题描述】:

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

【问题讨论】:

可能与我有关?:***.com/questions/175655/… - 如果有人知道这一点,也请告诉我! 【参考方案1】:

有钩子method_addedmethod_undefined。 Garry Dolley 写了一个 Immutable module 来防止猴子修补。

【讨论】:

【参考方案2】:

我发现这篇博文介绍了如何使用 method_added 来跟踪猴子补丁。扩展它以跟踪已修补的方法并不难。

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

【讨论】:

以上是关于您如何检测到 Ruby 中发生了猴子补丁?的主要内容,如果未能解决你的问题,请参考以下文章

“猴子补丁”真的那么糟糕吗? [关闭]

Ruby 中的“猴子补丁”到底是啥意思?

寻找可能导致麻烦的 Ruby 猴子补丁的来源?

ruby 因为没人喜欢猴子补丁。

ruby 猴子补丁模式

ruby 猴子补丁模式