Ruby: улавливание всех методов, отправленных объекту

Я создаю странный класс, где я хочу поймать каждый метод, отправленный объекту класса. Я могу достичь большей части того, что хочу, с помощью метода method_missing, например.

class MyClass
    def method_missing m, *args
        # do stuff
    end
end

Тогда проблема заключается в всех методах экземпляра, которые MyClass наследует от Object. Я мог бы пройти каждый метод один за другим и переопределить их, но я надеялся на более гибкий подход. Все методы метапрограммирования, которые я пытался, жаловались на NameError, когда пытаюсь коснуться этих методов экземпляра.

Ответ 1

Как отмечено в комментариях и ответе от @DanCheail, если вы используете ruby ​​1.9+, вы должны использовать BasicObject, а не методы определения Object. Во время этой публикации использование 1.8.x все еще было довольно распространенным, хотя в течение некоторого времени было выпущено 1.9.


Вместо того, чтобы пытаться "переопределить" что угодно, вы можете обернуть свой объект в пропущенный (по большей части) прокси-объект, например:

class MyProxy
  instance_methods.each do |meth|
    # skipping undef of methods that "may cause serious problems"
    undef_method(meth) if meth !~ /^(__|object_id)/
  end

  def initialize(object)
    @object = object
  end     

  def method_missing(*args)
    # do stuff
    p args
    # ...
    @object.send(*args)
  end
end

MyProxy.new(MyClass.new).whatever

Ответ 2

Если вы используете Ruby 1.9, вы можете наследовать свой класс от BasicObject, чтобы получить чистый слайд для работы из:

http://ruby-doc.org/core-1.9/classes/BasicObject.html

Ответ 3

Если вы используете Ruby 1.8, вы можете использовать драгоценный камень blanclate.