我想在某些課程發生某些事情時收到通知。我想以這樣的方式設置它,以便在這些類中實現我的方法不會改變。如何通過包含模塊來包裝調用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