2013-10-21 3 views
0

중첩 모듈에서 모듈 상수에 액세스하는 데 문제가 있습니다. 여기에 코드입니다 :중첩 모듈에서 상수에 액세스

outer.rb

require 'inner.rb' 

module Outer 
    BASE_DIR = "cache/" 
end 

inner.rb

module Outer 
    module Inner 
    puts BASE_DIR 
    end 
end 

나는 inner.rb에서 코드를 실행하면 다음과 같은 에러가 발생

<module:Inner>': uninitialized constant Outer::Inner::BASE_DIR (NameError) 

나는 BASE_DIR은 내부 모듈에서 접근 할 수 있어야하며 외부 모듈에서도 선언되어야합니다.

+0

게시물 상단의 오류 메시지는 무엇입니까? 나는 그것을 삭제할 자유를 얻었다. –

+0

잘못된 복사/붙여 넣기. 편집 해 주셔서 감사합니다. – Chris911

답변

2

로드 순서의 문제입니다. (가) 필요한 실제 코드를 필요로 교체하면 코드가이 순서로로드되는 것을 알 수 :

module Outer 
    module Inner 
    puts BASE_DIR 
    end 
end 

module Outer 
    BASE_DIR = "cache/" 
end 

가 지금은 그 일을 할 수없는 이유를 아주 쉽습니다. 오류 메시지에서 알 수 있듯이 상수는 액세스하려고 할 때 정의되지 않습니다. 이는 메소드 정의 내에 이 아닌 코드가 모두이므로 즉시 실행됩니다. 방법에서 일정에 액세스하는 것은 그러나 가능하다 :

module Outer 
    module Inner 
    def self.foo 
     puts BASE_DIR 
    end 
    end 
end 

module Outer 
    BASE_DIR = "cache/" 
end 

Outer::Inner.foo 
# cache/ 

몇 가지 가능한 솔루션이 필요에 따라 있습니다

  • 가 (옵션이 될 수 없습니다) 상수 외부 방법의 사용을 제거
  • 변화로드 순서 (파일 끝에 require 넣어)
  • 위임 전용 클래스 전역 설정의 저장/모듈
0

아니요, 루비는 그렇게하지 않습니다. 루비가 이름을 풀기 위해 사용하는 조상 사슬을 찾으십시오.

대신 Outer::BASE_DIR을 사용해야합니다.

here은 루비 클래스 시스템과 레일 자동 로딩에 대한 멋진 이야기입니다.

+0

이것을 시도해보십시오. 'Outs :: BASE_DIR'을 넣고이 에러를 얻는다. (꽤 많이 동일하다.) : : 초기화되지 않은 상수 Outer :: BASE_DIR (NameError)' – Chris911

+0

는 @ p11y의 답을 살펴 본다. 파일의로드 순서와 관련이 있습니다. 루비는 파일과 루비 코드가로드되는 순서에 민감합니다. – phoet