2010-12-23 2 views
1

왜이 기능이 작동하지 않습니까?Ruby : 모듈 내에서 클래스 다시 열기

module XT 
    puts Fixnum.class # So we're sure to re-open the Fixnum class 
    class Fixnum 
    def hi 
     puts "HI from module XT" 
    end 
    end 
end 

모듈을 필요로하고 로딩 후 hi 방법은 아직 Fixnum이라는 추가되지 않는다. 모듈 래퍼를 제거하면 작동합니다.

답변

4

XT::Fixnum이 아니라 Fixnum을 정의합니다.

6

@Jeremy가 쓴대로 상수는 모듈에 의해 이름 공간이 지정되며 클래스를 정의하는 것은 클래스 객체를 상수에 할당하는 것입니다. 기본적

class Fixnum; end 

은 (후자 덮어 반면, Fixnum이 이미 존재하는 경우, 전자는 다시 열 것이라는 사실을 제외)

Fixnum = Class.new 

동등 (약)이다.

즉, 모듈 (또는 클래스 IS-A 모듈)의 내부에서 수행하면 상수 Fixnum은 해당 모듈 내부에서 이름 공간으로 지정됩니다.

최상위 상수에 명시 적으로 액세스하려면 최상위 레벨에서 파일 시스템 검색을 시작하도록 UNIX에 지시하는 방법과 매우 비슷한 방식으로 최상위 레벨에서 조회를 시작하도록 Ruby에 지시 할 수 있습니다.

module XT 
    class ::Fixnum; end 
end