2011-01-20 87 views
0

我已經看到了一些代碼,使一個類的方法,例如,你可以寫以下所有def調用的Ruby調用方法?

class_method :instance_method, 

別名instance_method,並從在包裝方法調用它每次調用時間。有沒有辦法可以撥打class_method,並將它應用於所有以下定義調用(如private的工作方式)?

回答

1

我不太明白你的問題。在將來,請提供一個關於您正在嘗試做什麼的規範,最好以可執行測試套件的形式提供,以便我們可以檢查我們自己的答案是否真的回答您的問題。

你也許在談論這樣的事情?

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 
+0

很抱歉的含糊不清的問題,但你肯定了我是問什麼的要點。謝謝 – 2011-01-20 13:51:15