루비 : :: 접두사는 무엇을합니까?


90

나는 Artifice 의 출처를 읽고 있었고 다음을 보았습니다.

module Artifice
  NET_HTTP = ::Net::HTTP
  # ...
end

라인 : https://github.com/wycats/artifice/blob/master/lib/artifice.rb#L6

Net::HTTP대신 그냥하지 않는 이유는 무엇입니까? ::Net::HTTP즉, ::접두사로 사용할 때 무엇을 의미 합니까?


15
"선두 콜론"이라는 문구를 사용하여이 주제를 검색했지만 처음에는 찾지 못했습니다. 바라건대이 의견이 그것을 바꿀 것입니다. :)
Nathan Long

@NathanLong 흥미로운 아이디어. 작동 했나요? 다시 신고 해주세요.
Darth Egregious 2015

답변:


222

::범위 결정 연산자이다. 그것이하는 일은 모듈을 찾을 수있는 범위를 결정하는 것입니다. 예를 들면 :

module Music
  module Record
    # perhaps a copy of Abbey Road by The Beatles?
  end

  module EightTrack
    # like Gloria Gaynor, they will survive!
  end
end

module Record
  # for adding an item to the database
end

에 액세스하려면 Music::Record외부에서의 Music당신을 사용합니다 Music::Record.

참조하려면 Music::Record에서 Music::EightTrack간단히 사용할 수있는 Record이 동일한 범위 (즉,의에 정의되어 있기 때문에 Music).

그러나 Record데이터베이스와의 인터페이스를 담당 하는 모듈 에 액세스하려면 Ruby가 원하는 것으로 생각 Music::EightTrack하기 Record때문에 사용할 수 없습니다 Music::Record. 이때 범위 확인 연산자를 접두사로 사용하여 전역 / 주 범위를 지정합니다 ::Record..


12
예, 매우 철저한 답변입니다. 감사!
ma11hew28

11
훌륭한 대답입니다. 참고로 무작위 하향 표에 대해 걱정하지 마십시오. 인생에는 훨씬 더 의미있는 것들이 있습니다.
Darth Egregious 2015

16
module A
  def self.method; "Outer"; end
end
module B
  module A
    def self.method; "Inner"; end
  end
  A.method   # => "Inner"
  ::A.method # => "Outer"
end

Artifice의 특정한 경우에, 여러분이 보여준 파일의 41 번째 줄 에 내부 Net모듈 이 정의되어 있습니다. 외부 Net모듈 에 대한 액세스를 유지하기 위해 ::Net.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.