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.