Как вы обнаружили, что в Ruby произошло исправление обезьян? - PullRequest
8 голосов
/ 03 декабря 2008

Как вы проверяете, что исправление обезьяны было сделано для определенного класса в Ruby? Если это возможно, возможно ли также получить предыдущие реализации атрибута, который был исправлен?

Ответы [ 2 ]

8 голосов
/ 03 декабря 2008

Есть крючки method_added и method_undefined. Гарри Долли написал I mmutable модуль , который предотвращает исправление обезьян.

4 голосов
/ 03 декабря 2008

Я нашел это сообщение в блоге, в котором рассказывается, как использовать 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
...