2011-01-20 16 views
0

는 당신이 그것을 호출 할 때마다 별칭 instance_method모든 def 호출에 Ruby 호출 메소드가 사용됩니까?

class_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

모호한 질문에 대한 미안하지만, 당신은 확실히 내가 묻고 있었는지의 요점을 얻었다. 고맙습니다 –

관련 문제