我想在某些课程发生某些事情时收到通知。我想以这样的方式设置它,以便在这些类中实现我的方法不会改变。如何通过包含模块来包装调用Ruby方法?
我想我有类似如下模块:
module Notifications
extend ActiveSupport::Concern
module ClassMethods
def notify_when(method)
puts "the #{method} method was called!"
# additional suitable notification code
# now, run the method indicated by the `method` argument
end
end
end
然后我就可以像这样把它混成我的课:
class Foo
include Notifications
# notify that we're running :bar, then run bar
notify_when :bar
def bar(...) # bar may have any arbitrary signature
# ...
end
end
我的钥匙愿望是,我不您不得不修改:bar
以使通知正常运行。这可以做到吗?如果是这样,我将如何编写notify_when
实现?
此外,我使用Rails 3,所以如果有ActiveSupport或其他技术我可以使用,请随时分享。 (我看着ActiveSupport::Notifications,但这需要我来修改bar
方法。)
它已经到了我的注意,我可能要使用“模块+超级帽子戏法”。我不确定这是什么 - 也许有人可以启发我?
如果:方法接受一个块? – 2010-11-18 20:47:02
您不必使用'define_method',您可以通过'eval'来定义方法。例如。 ''eval“def#{method}(* args,&block)...' – 2010-11-18 20:49:40
这要求'notify_when'出现在方法定义之后,所以它不会在你的代码示例中工作,并且它修改了'bar '方法,但是除了使用代理对象外,你还可以修改(装饰)你的方法。 – horseyguy 2010-11-18 21:05:39