2009-12-31 6 views
8

Module.method_defined?(:method)을 사용하는 모듈에 메서드가 정의되어 있는지 확인하려고하는데 false를 반환하면 true로 returing되어야합니다.Module.method_defined (: 메서드)가 제대로 작동하지 않는 이유는 무엇입니까?

module Something 
    def self.another 
    1 
    end 
end 

Something.methods는 '다른'은 나와 있지만 Something.method_defined?(:another) 반환 false 있습니다.

이 방법은 자체에 정의되어 있기 때문에 작동하지 않을 수 있습니까? 이 경우에 method_defined? 이외의 다른 모듈에서 메서드가 정의되어 있는지 확인하는 다른 방법이 있습니까?

답변

10

모듈에 모듈 방법이 있는지 확인하려면 respond_to?를 사용할 수 있습니다. 모듈 는 :

Something.respond_to?(another) 
=> true 

을 method_defined? 모듈이 포함 된 클래스의 INSTANCES가 주어진 메소드에 응답하는지 여부를 알려줍니다.

+2

아마도 나는이 잘못을 읽고 있습니다 만, 'Something.respond_to (: another)'가 아니어야합니다. 그래서'another'가 상징입니다. 그렇지 않으면'another'가 정의되지 않은 에러를 일으키지 않을까요? –

5

모듈 방법은 메타 클래스에 정의되어 있습니다. 그래서 당신은 또한과 방법의 포함을 확인할 수 있습니다

k = class << Something; self; end # Retrieves the metaclass 
k.method_defined?(:another) #=> true 

당신은 Understanding Ruby Metaclasses에 대한 자세한 내용을보실 수 있습니다.

+0

해당 사이트의 다이어그램은 혼란스러워합니다. 클래스의 메소드를 '상속'하는 인스턴스는 무엇을 의미합니까? 나에게 잘못된 용어로 보입니다. 또한 'instance_eval'이라고 표시된 화살표가 메타 클래스를 가리키고 있다는 것은 무슨 의미입니까? 'instance_eval' 평가는 메타 클래스에서 일어나지 않습니다. 예외는 instance_eval에서'def'의 동작을 대신하는 것으로, 메타 클래스의 메소드를 대신 정의합니다. – horseyguy

+0

감사합니다! 왜 다른 대답이 체크 표시가되었는지 확실하지 않습니다. 이것은 실제로 그것을하는 방법입니다. –

관련 문제