2011-10-21 3 views
1

루비의 모듈 수준 변수를 참조하는 데 어려움이 있습니다.모듈 내에서 모듈 수준 변수를 참조합니다.

module M 
    @@a=1 

    def self.a 
    @@a 
    end 

    class A 
    def x 
     M.a 
    end 
    end 
end 

자,이 예제는 나를 위해 잘 작동하지만이 모듈을 통해 확산되는 약간 더 복잡한 상황 (에 실패 : 내가 내부적으로 엄마를 참조하고있어이 같은 상황을 말해봐 로컬 보석에 설치된 파일 수 -하지만 내 이해는 코드가 실행되는 방식에 영향을 미치지 않아야 함) : M : M (NoMethodError)에 대해 정의되지 않은 메소드 'a'.

이렇게 문맥에서 모듈 수준 변수를 참조하는 올바른 방법입니까? 거기에 더 단순한/더 관용적 인 방법이 있습니까?

답변

3

모듈이 다른 파일 위에 펼쳐져 있으면 메서드가 호출되기 전에 초기화가 실행되는지 확인해야합니다. 그들이 같은 파일에 있다면, 이것은 보장 된만큼은되어야하지만, 어떻게 든 나누면 문제가 될 수 있습니다.

난 당신이 보통이 멀리 얻을 수 있습니다 발견했습니다

module M 
    def self.a 
    @a ||= 1 
    end 
end 

이 변수가 변경 될 경우

, 당신은 뮤 테이터 방법이 필요합니다. Rails는 기본적으로 ActiveSupport의 일부인 원하는 것을 수행하는 mattr_accessor을 제공합니다.