2014-07-25 3 views
3

생각에는 내가 가진 나는 "super_calling이 슈퍼 클래스를 가지고 있지 않다"거나 그와 비슷한 것을 (정확히 기억하지는 않는다) 말하는 에러를 얻는다. - 내가 루비에서 너무 많이 부탁 해요 아니면 내가 이해하지 못하는 뭔가가루비 호 "슈퍼"

def test_method 
    "Executed first" 
    super 
end 

내 질문은 :

모든 미세 (당연) C::test_method 경우는 다음과 같이 정의되지 않은 동작? 누군가가 빛을 비춰 줄 수 있습니까?

+0

클래스에 모듈을 포함하기 전에 먼저 모듈을 선언해야한다고 생각합니다. –

+0

@boulder_ruby 그렇습니다. 내가 가지고있는 모듈은 레일스 lib 폴더에 있으며 실제로 자동으로 미리로드됩니다. 그래서 저는 그 부분에 아무런 문제가 없다고 생각합니다. :) – Dmitri

+0

음, 나는'super'가 호출 한 메소드 ('test_method')가 아니라'super_calling'에서 참조 된 메소드를 참조한다고 믿습니다. –

답변

1

super_calling 전체를 제거하고 C::test_method에서 super을 사용하면됩니다.

그 시점에서 B::test_method이라고 부릅니다.

+1

Em. 내가 올바르게 이해한다면 - 실제로는 아닙니다. 두 모듈을이 순서로 포함하면 조상 체인은 [A, C, B, Object]와 유사합니다. C :: test_method의 컨텍스트에서 "super"는 B :: test_method입니다. C :: test_method에서 "super"를 명시 적으로 정의하면 B :: test_method가 호출됩니다. – Dmitri

+2

답변이 잘못되었습니다. 보통'super' 호출로 C의'test_method'를 정의 할 때'A.new.test_method'를 호출하면 실제로 "Executed first", "Executed second"가 출력됩니다. 따라서 모듈 C에서 슈퍼 호출은 B에서 호출을 호출합니다. –

+1

예, 잘못된 호출 체인이 작동합니다. 'test_method'가 아니라 'super_calling'메소드를 사용하려고하는 사용자의 코드에 문제가 있습니다. –