От: http://cheind.blogspot.com/2008/12/method-hooks-in-ruby.htmlRuby: Как цеплять методы класса
Я имею
# Contains methods to hook method calls
module FollowingHook
module ClassMethods
private
# Hook the provided instance methods so that the block
# is executed directly after the specified methods have
# been invoked.
#
def following(*syms, &block)
syms.each do |sym| # For each symbol
str_id = "__#{sym}__hooked__"
unless private_instance_methods.include?(str_id)
alias_method str_id, sym # Backup original
# method
private str_id # Make backup private
define_method sym do |*args| # Replace method
ret = __send__ str_id, *args # Invoke backup
block.call(self, # Invoke hook
:method => sym,
:args => args,
:return => ret
)
ret # Forward return value of method
end
end
end
end
end
# On inclusion, we extend the receiver by
# the defined class-methods. This is an ruby
# idiom for defining class methods within a module.
def FollowingHook.included(base)
base.extend(ClassMethods)
end
end
Тогда у меня есть класс, как так:
class User
def self.get
#class method
end
def name
#instance method
end
end
В другом месте/файла я Переооткрытие Класс пользователя и крючок в нем
class User
include FollowingHooks # include the hook module
following :name do |receiver, args|
#do something. This works!!
end
following :get do |reciever, args|
#do something. THIS DOESNT WORK
# Which is to be expected looking at the FollowingHooks module definition.
end
end
Работа с любыми методами. Однако попытка подключиться к методам класса не делает ничего, что я получаю, потому что модуль NextHooks не реализует его. Как я могу реализовать перехватчики для методов класса? Я совершенно не знаю.
Это не работает. Я получаю «неопределенный метод« следующий »за #». Это имеет смысл, так как «class << self» будет меняться в одноэлементный контекст. Кроме того, если каким-то образом это было разрешено, оно все равно попадет в зацепку с вызовом «define method» в FollowHook. Поскольку define_method всегда определяет метод экземпляра, а не метод класса. Я думал об использовании метода «define_singleton_method», если контекст был классом, но это тоже не совсем так. –
Вы запустили «Class.send (: include, FollowHook)»? Это то, что разрешает «неопределенный метод "в экземплярах класса. – 2013-03-01 15:21:27
Класс - это всего лишь экземпляр класса, поэтому вызов метода define_method в одноэлементном классе правильно определяет эти методы как методы класса. – 2013-03-01 15:23:10