2009-09-20 2 views
0

런타임에 별칭이 지정된 메소드가 호출되는 심볼을 (효율적으로) 가져 오려고합니다. 그것을 얻기위한 어떤 종류의 스택 프레임 객체에 대한 직접적인 효율적 접근은 환상 일 것입니다."에 의해 호출 된"심볼에 대한 Ruby 액세스

예 :

클래스 푸
    데프 generic_call (* 인수)
        풋 ("generic_call() #을 사용하여 호출 된 {???}")
   

    별칭을 종료 : specific_call1가 :
,369을 generic_call    별칭 : specific_call2 : generic_call



Foo.new.specific_call1
Foo.new.specific_call2

결과 나는) (


generic_call을 싶어 specific_call1()을 사용하여 호출되었습니다.
specific_call2()를 사용하여 generic_call()이 호출되었습니다.

답변

1
class Foo 
    def generic_call() 
    puts "generic call was called by #{caller[0][/in `([^']+)'/, 1]}" 
    end 

    def specific_call1() generic_call end 
    def specific_call2() generic_call end 
end 

Foo.new.specific_call2 # Prints: generic call was called by specific_call2 

당신이 별칭으로 만든 방법은 기존 방법의 실제 사본이기 때문에 generic_call에서 specific_callN을 만들 별칭을 사용하는 경우이 그러나 작동하지 않습니다 - 실제로 이유를 인 (원래 메소드를 호출하지 않습니다 별칭에 영향을주지 않고 자유롭게 원본을 재정의 할 수 있습니다.

+0

yep 별칭은 "함수 포인터"즉 : 객체의 해시에있는 다른 심볼을 lambda로 지정하여 원래 심볼을 자유롭게 조작 할 수있게합니다. 이제 기호에 할당 된 실제 "코드"블록이 비정상적 일 수 있으며 "이름은 할당 된 기호에서 비롯됩니다. 그러나 –

0

기본 제공 방법이 없습니다. 당신은 종류의이 같은 해킹 할 수

def current_method_name 
    caller[0].split('`').last.split('\'')[0] 
end 
+0

예"에 대해 알고 있습니다. 비효율적입니다. –

1

현재 메서드 이름을 얻을 수있는 코드 : 어쩌면

module Kernel 
    private 
    # Defined in ruby 1.9 
    unless defined?(__method__) 
     def __method__ 
     caller[0] =~ /`([^']*)'/ and $1 
     end 
    end 
    end 
+0

은 각각에 대한 새로운 코드 블록을 복제하고 인스턴스화하지 않고 심볼을 사용하여 무언가를 할 수있는 메소드를 갖는 것입니다. –

+0

죄송합니다. 이전 주석을 삭제하고 싶습니다. - 틀렸어. :) –

0

, 당신이 뭔가를 원하는?

class Object 
    def named_alias(name, generic_name) 
    ([Class, Module].include?(self.class) ? self : self.class).class_eval do 
     define_method(name) { |*args| send(generic_name, name, *args) } 
    end 
    end 
end 

class Foo 
    def generic_call(f, *args) 
    puts("generic_call() was called by using #{f} with #{args}") 
    end 

    # def specific_call1(*args) 
    #  generic_call(:specific_call1, *args) 
    # end 
    named_alias(:specific_call1, :generic_call) 
    named_alias(:specific_call2, :generic_call) 
end 

Foo.new.specific_call1 
Foo.new.specific_call2 

부인 : 나는 루비 몰라, 난 그냥 다음 코드를 조금 적응, how one performs currying there 봤했습니다.

관련 문제