2013-05-06 2 views
0

에 액세스 할 수없는 행동을 보여주는 몇 가지 코드 나는에 대해서 이야기하고있다 : 그래서, 새로운 방법은 클래스 여기

module A 
    def foo; end 
end 

# initialize B with no methods 
module B; end 

class C 
    include B 
end 

# add methods to B 
module B 
    def foo; end 
    include A 
end 

C.new.foo 
C.new.bar # error: instance method bar is not defined for C 

def (B가 나중에 다시 포함되지 않는 한) B에 더해진 s는 C에 반영되지만, include은 더하지 않습니다. 왜 이것이 주위에 깨끗한 방법이 있습니까? 당신이 무슨 일 클래스 C의 모듈 M입니다 include

+6

'bar'는 어디에서 왔는가? 나는'A'와'B'에서'foo'를 볼 수 있지만 어디에서도'bar'를 볼 수는 없습니다. –

답변

1

:

  1. 루비 클래스를 만들고 그 방법 테이블 포인터, 상수 테이블 포인터와 클래스 변수 테이블 포인터 포인트 (의이 ⟦M′⟧를 부르 자) M의 메소드 테이블, 상수 테이블 및 클래스 변수 테이블.
  2. ⟦M′⟧의 수퍼 클래스 포인터는 C의 수퍼 클래스로 설정됩니다.
  3. C의 수퍼 클래스 포인터는 ⟦M′⟧으로 설정됩니다.

include 모듈이 M 인 경우이 프로세스가 반복적으로 적용됩니다.

include에 전화 할 때 믹스의 재귀 적 평평화는 번 적용됩니다. 이후에 만들어진 상속 계층 구조의 변경 사항은 이 아니며이 반영됩니다. 당신이 M의 방법 테이블에 메서드를 추가하는 경우에만 하나 방법 테이블이있는 두 M⟦M′⟧은 참조,이 때문에

는하지만, 그 변화가 반영됩니다.

관련 문제