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

Là ::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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.