Ruby: tiền tố :: làm gì?


88

Tôi đã đọc qua nguồn của Artifice và thấy:

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

dòng: https://github.com/wycats/artifice/blob/master/lib/artifice.rb#L6

Tại sao không chỉ làm Net::HTTPthay vì ::Net::HTTP, nghĩa là nó có nghĩa gì khi bạn sử dụng ::làm tiền tố?


15
Tôi đã tìm kiếm chủ đề này bằng cách sử dụng cụm từ "dấu hai chấm ở đầu" và không tìm thấy nó lúc đầu; hy vọng bình luận này sẽ thay đổi điều đó. :)
Nathan Long

@NathanLong Ý tưởng thú vị. Nó đã hoạt động? Vui lòng báo lại.
Darth Egrerious

Câu trả lời:


220

::toán tử phân giải phạm vi. Những gì nó làm là xác định phạm vi mà một mô-đun có thể được tìm thấy. Ví dụ:

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

Để truy cập Music::Recordtừ bên ngoài Musicbạn sẽ sử dụng Music::Record.

Để tham chiếu Music::Recordtừ Music::EightTrackbạn có thể chỉ cần sử dụng Recordvì nó được xác định trong cùng một phạm vi (của Music).

Tuy nhiên, để truy cập Recordmô-đun chịu trách nhiệm giao tiếp với cơ sở dữ liệu của Music::EightTrackbạn, bạn không thể chỉ sử dụng Recordvì Ruby nghĩ rằng bạn muốn Music::Record. Đó là khi bạn sẽ sử dụng các nhà điều hành có độ phân giải phạm vi như một tiền tố, quy định cụ thể phạm vi toàn cầu / main: ::Record.


12
Vâng, câu trả lời rất thấu đáo. Cảm ơn!
ma11hew28

11
Câu trả lời xuất sắc. Tôi không lo lắng về các phiếu bầu ngẫu nhiên. Có nhiều điều ý nghĩa hơn trong cuộc sống.
Darth Egrerious

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

Trong trường hợp cụ thể của Artifice, tại dòng 41 của tệp mà bạn đã hiển thị được xác định là một Netmô-đun bên trong . Để giữ cho Netmô-đun bên ngoài hoạt động , nó sử dụng ::Net.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.