2012-07-13 10 views
10

내가 약을 모르는 어떤 임의의 라이브러리 코드입니다. 위의 예에서 메서드가 재정의되었음을 감지 할 수 있습니까?</p> <pre><code>class Foo def hi end end class Bar < Foo def hi end end </code></pre> <p>그리고 내가 매개 변수로 <code>Bar</code>을 통과하고있어 일부 코드가 있다고 가정 : 여기에 가정

def check(x) 
    do_something_with(x.method(:hi)) 
end 

, 나는 x.hi이 ( x 참조 Bar의 인스턴스 곳) Foo#hi에서 다르다는 것을 알 수 있습니까? 가레스의 답변에 따라

, 이것은 내가 지금까지있어 무엇 :

def is_overridden?(method) 
    name = method.name.to_sym 
    return false if !method.owner.superclass.method_defined?(name) 
    method.owner != method.owner.superclass.instance_method(name).owner 
end 

무시 무시한? 화려한?

+0

관련성이있는 것은 아니지만, 왜 이렇게하고 싶은지 궁금합니다. –

+0

또한 동일한 클래스의 기존 메서드를 재정의하는 것과는 상속 관계를 "오버라이드"하는 것에 만 관심이있는 것으로 보입니까? –

답변

9

이 작업을 수행 할 수 있습니다 :

if x.method(:hi).owner == Foo 

내가 지금까지 루비 전문가가되는입니다; 누군가가 이것보다 나은 방법을 가지고 있다면 나는 놀라지 않을 것입니다.

+0

니스! 나 자신도 똑같은 것을 우연히 발견했다. 그리고 당신처럼 - 나는 다른 누군가가 따라 와서이 접근법을 위해 우리를 쏘아 줄 때까지 기다릴 것입니다. 그렇지 않다면 나는 이것을 받아서 내가 내가 한 것을 성취 할 수 있다고 생각한다. –

+0

@DanTao 당신의 경우에는 문제가되지 않지만,'Foo'가 원숭이 패치라면'Foo'가 소유자임을보고합니다. –

+0

나는 그 사건에서 어떻게 다른 일을 할 수 있는지 정말로 모르겠다. (원숭이 패치는 어쨌든 * 무시하지 않습니다.) 나는 무엇인가 놓치고 있습니까? –

0

흥미로운 질문입니다! 나는 같은 질문에 대해 궁금해했다. Bar 클래스를 다시 열고 메서드가 정의 된 Bar의 조회 경로에서 조상이 누구인지 확인할 수 있습니다.

class Bar < Foo 
    ancestors.each do |ancestor| 
    puts ancestor if ancestor.instance_methods.include?(:hi) 
    end 
end 
관련 문제