0
我已經看到了一些代碼,使一個類的方法,例如,你可以寫以下所有def調用的Ruby調用方法?
class_method :instance_method,
別名instance_method
,並從在包裝方法調用它每次調用時間。有沒有辦法可以撥打class_method
,並將它應用於所有以下定義調用(如private
的工作方式)?
我已經看到了一些代碼,使一個類的方法,例如,你可以寫以下所有def調用的Ruby調用方法?
class_method :instance_method,
別名instance_method
,並從在包裝方法調用它每次調用時間。有沒有辦法可以撥打class_method
,並將它應用於所有以下定義調用(如private
的工作方式)?
我不太明白你的問題。在將來,請提供一個關於您正在嘗試做什麼的規範,最好以可執行測試套件的形式提供,以便我們可以檢查我們自己的答案是否真的回答您的問題。
你也許在談論這樣的事情?
module MethodHook
private
def class_method(m=nil)
return if @__recursing__ # prevent infinite recursion
return @__class_method__ = true unless m
@__recursing__ = true
old_m = instance_method(m)
define_method(m) do |*args, &block|
puts "before #{m}(#{args.join(', ')})" # wrap wrap wrap
old_m.bind(self).(*args, &block)
puts "after #{m}" # more wrapping
end
@__recursing__ = nil
end
def method_added(m)
class_method(m) if @__class_method__
super
end
end
使用這樣的:
class Foo
extend MethodHook
def unwrapped
puts __method__
end
class_method
def wrapped
puts __method__
end
end
f = Foo.new
f.unwrapped
# unwrapped
f.wrapped
# before wrapped()
# wrapped
# after wrapped
class Foo
class_method(:unwrapped)
end
f.unwrapped
# before unwrapped()
# wrapped
# after unwrapped
很抱歉的含糊不清的問題,但你肯定了我是問什麼的要點。謝謝 – 2011-01-20 13:51:15