Как вы проверяете, что исправление обезьяны было сделано для определенного класса в Ruby? Если это возможно, возможно ли также получить предыдущие реализации атрибута, который был исправлен?
Есть крючки method_added и method_undefined. Гарри Долли написал I mmutable модуль , который предотвращает исправление обезьян.
method_added
method_undefined
Я нашел это сообщение в блоге, в котором рассказывается, как использовать 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
Используя открытые классы, мы можем переопределить 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