2012-03-22 8 views
11

저는이 행동에 직면했습니다. 저는 정말로 이해하지 못합니다.루비 믹스 오버라이드 오버라이드 방법 설명

module M 
    def foo 
    "module_foo" 
    end 
end 

class C 
    def foo 
    "class_foo" 
    end 
    include M 
end 

puts C.new.foo 

C.new.foo 실제로 class_foo을 반환합니까? 메소드가 모듈의 메소드에 의해 오버라이드되어야한다는 것이 거의 확실했습니다. 또 다른 것은 "class_foo"super으로 바꾸면 C.new.foo이``module_foo "를 반환합니다.

클래스 인스턴스 메소드가 정의되기 전에 실제로 모듈처럼 보입니다. 분명히 해줄 수 있니?

답변

14

유지 mixin에 프로그래밍 루비 섹션에서 :

사실, 혼합 모듈 효과적으로 슈퍼 클래스로 을 작동합니다.

그래서 당신이 경험하는 것은 정상입니다. 모듈 M이 클래스 C의 슈퍼 클래스입니다

따라서 클래스 C에서 foo는 방법은 모듈 M에서 푸 메소드를 오버라이드 (override)

+0

ㅎ 이렇게 분명합니다. 감사!! –

3

여기에 루비 방법 조회 수행 방법은 다음과 같습니다

  1. 수신기의 싱글 톤 클래스;
  2. 수신자 등급;
  3. 포함 된 모듈 방법;
  4. 수신자의 수퍼 클래스에서 반복 찾아보기;
  5. 메서드가 전혀 발견되지 않으면 method_missing call; http://ruby-metaprogramming.rubylearning.com/html/ruby_metaprogramming_2.html

    따라서, 방법을 찾기 위해, 루비는 수신기의 클래스에 가고, 그 방법을 찾을 때까지 거기에서 그것은 조상 체인을 올라 :

여기에서 자세한 내용을 확인할 수 있습니다. 이 동작을 "오른쪽으로 한 걸음 올린 다음" 규칙이라고도합니다. 수신기의 클래스 오른쪽으로 한 단계 이동 한 다음 방법을 찾을 때까지 조상 체인을 위로 이동합니다. 모듈을 클래스 (또는 다른 모듈)에 포함 시키면 Ruby는 모듈을 래핑하는 익명 클래스를 만들고 익명 클래스 을 포함 클래스 바로 위에 체인에 삽입합니다.

+1

모든 조상을 걸을 때까지 method_missing이 확인되지 않습니다. – dbenhur

+0

고맙습니다. 고쳐 주셔서 고맙습니다. – andersonvom

+1

0. 수신자의 싱글 톤 클래스; –

관련 문제