2016-11-30 1 views
4

나는 익명의 모듈 내에서 익명의 클래스를 정의 할 수 있습니다 : 즉익명 모듈 및 클래스를 Ruby에 중첩시킬 수 있습니까?

m = Module.new 
c = Class.new 

: 실제로 익명 모듈에 "둥지"의 개념을 적용 않습니다

c = nil 
m = Module.new do 
    c = Class.new 
end 

m #=> #<Module:0x007fad3a055660> 
C#=> #<Class:0x007fad3a0555e8> 

은 위의 해당 있습니까?

+0

정의 " –

+1

흥미 롭고 익명의 모듈이 Module.nesting에 등록되어 있지 않습니다. –

+0

@SergioTulentsev 질문에 대한 답을 수정했습니다. 전혀 중첩되지 않았을 수 있습니다. – Stefan

답변

2

익명 처리가 아닙니다.

Foo = Class.new # => Foo 
foo = Class.new # => #<Class:0x007fe5dd45d650> 

그러나 그것은 또 다른 둥지하지 않습니다 : 일정에 동적으로 생성 된 클래스 지정이 명명하게

module Bar 
    Baz = Module.new do 
    p Module.nesting # => [Bar] 
    end 
end 

심지어 그 문제에 대한 동적 인에 관하여 :

module Quz 
    eval 'module Qux; p Module.nesting; end' # => [Quz::Qux, Quz] 
end 

스코프 게이트에 관한 내용입니다. 키워드 classmodule -


는 지금까지 상수에 관한 한, 두 개의 범위 게이트가 있습니다.

중첩은 순전히 구문 론적으로 수행됩니다. 즉, 이상한 얻을 이유 :

module Do 
    X = 42 
end 

module Do 
    module Re 
    p Module.nesting # => [Do::Re, Do] 
    p X    # => 42 
    end 
end 

module Do::Mi 
    p Module.nesting # => [Do::Mi] 
    p X # => uninitialized constant 
end 

Do.module_eval { p X } # => uninitialized constant 
Do.instance_eval { p X } # => uninitialized constant 

그래서 루비 class 또는 module이, 그것은 "현재 노드" 더 둥지 키워드를보고합니다. 닫는 end이 발견되면 트리 위로 올라갑니다. 새로운 상수가 정의되면 현재 상수에 놓습니다.

+0

그래서'Module.nesting'은 상수 조회에 사용되는 모듈 스택입니다. 모든'module' (또는'class') 키워드는 임의의 모듈을 스택에 푸쉬합니다 ('end'에서 터진다). 그리고 맨 위에있는 요소는 새로운 상수의 접두사로 사용됩니다. – Stefan

+0

@ 스 테판. – ndn

+0

_constants_만이 저장되고 암시 적 계층 구조를 형성합니다. 현재 중첩은 일시적이며 어디에도 저장되지 않습니다. 동일한 모듈을 다른 중첩에서 다시 열 수 있습니다. 나는 결론을 내릴 것이다. 모듈과 클래스는 중첩 될 수 없으며 상수 만이 중첩 될 수있다. 그 맞습니까? – Stefan

관련 문제