2012-01-24 2 views
6

나는 그 이름을 사용하지 않고 루비 자체에서 메서드를 호출하는 방법이 있습니까?Ruby : 슈퍼와 비슷한 메서드를 호출하는 키워드가 있습니까?

메서드가 일부 메타 프로그래밍 기술로 만들어진 경우 해당 이름으로 호출하는 것은 읽기 어려울 수 있습니다. 일반적으로 정의 된 방법의 경우에도 이름이 확실하지 않거나 이름이 길면 일부 키워드 (예 : super과 유사) 내에서 이름을 부르는 것이 편리 할 수 ​​있습니다.

답변

11

현재 메서드의 이름을 Symbol으로 반환하는 Kernel#__method__을 사용할 수 있습니다. super과 달리 이것은 키워드가 아니라 일반적인 방법이므로 메소드를 호출하기 위해 필수 인수와 함께 send 메소드에 전달해야합니다. 나는 그 같으면 모든 솔루션 생각할 수 없다 __method__없이

class Foo 
    def self.define_fact(method_name) 
    define_method(method_name) do |n| 
     n > 0 ? n * send(__method__, n - 1) : 1 
    end 
    end 
end 

f = Foo.new 
# puts f.fact(5) 
# => undefined method `fact' for #<Foo:0x8ede45c> (NoMethodError) 
Foo.define_fact :fact 
puts f.fact(5) 
# => 120 

: 여기

obj = Object.new 

def obj.foo 
    p __method__ 
end 

obj.foo 
# => :foo 

그리고 동적으로 계승 방법을 정의하는 클래스 메소드의 예입니다 : 여기

은 무엇 __method__ 반환하는 것은 가능하다면 피해야하는 것이 더 좋은 eval과 관련됩니다.

+0

감사합니다. KL-7, 귀하의 답변에서이 것에 대한 특별한 키워드가 없다고 가정합니다. – Alexey

관련 문제