2011-07-05 3 views
4

:누군가 나에게 루비 상수 검색을 설명해 줄 수 있습니까? 더 구체적으로

  • 때 당신이 범위를 앞에해야합니까 :: (같은 ::Foo::Bar)
  • 직접 확인 스코프 const를 참조한다? (단지 Foo::Bar)
  • 이 동작이 너무 혼란스러운 이유가 있습니까?

편집 : 나는 지금까지 내가 이해 한대로이

module Foo 
    THING = 'thing' 
    module Bar 
    puts THING 
    end 
end 
#=> thing 

module Foo::Bar 
    puts THING 
end 
#=> NameError: uninitialized constant Foo::Bar::THING 

답변

5

현재 이름 공간에있는 같은 이름의 다른 일정이있을 때

로 :: (같은 : 푸 :: 바) 범위 을 접두사해야 할 때.

직접 범위를 참조하는 경우는 const ok? (그냥 Foo :: Bar)

현재 네임 스페이스에 같은 이름의 다른 상수가없는 경우. 예. 그 식별자가 모호하지 않은 경우. 마찬가지로, 모호하지 않은 경우 가독성을 높이기 위해 Bar을 사용할 수 있습니다.

이 동작이 너무 혼란스러운 이유가 있습니까?

특수성에 대한 가독성과 사용 편의성이 균형을 이룹니다. 네임 스페이스에 깊이 들어가면 항상 ::Foo::Bar::Baz::Boo (글로벌 고유 식별자)을 수행하고 싶지는 않습니다.

+0

내가 말하고있는 괴상함에 대해 좀 더 분명했습니다. –

+0

두 번째 예제는 Foo :: Bar 네임 스페이스를 범위로 가져옵니다. OTOH, 첫 번째 예에서와 같이 명시 적으로 각 네임 스페이스를 열면 Foo와 Foo :: Bar가 둘 다 범위에 포함됩니다. – Ian

+0

꽤 이상하지만 설명 할 수 있습니다. 나는 모든 모듈에서 어느 구문에서든 클래스를 검색 할 것이라고 가정했다. 두 구문 사이의 다른 차이점을 알고 있습니까? –

0

같은 물건에 대해 이야기하고있다/그것을 경험 : 모듈/클래스 Foo에, 다음 BarFoo::Bar 참조하는 경우는 아무튼하지 않는 한 어떤 경우에는 ::Bar을 의미합니다.)

루비를 처음 접했기 때문에 소금 한 알씩 가져 가십시오. - P

관련 문제