Ruby: What does :: คำนำหน้าทำอะไร?


91

ฉันอ่านที่มาของ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

คำตอบ:


224

::เป็นผู้ประกอบการที่มีรายละเอียดขอบเขต สิ่งที่ทำคือกำหนดขอบเขตของโมดูลที่สามารถพบได้ภายใต้ ตัวอย่างเช่น:

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จากด้านนอกของคุณจะใช้MusicMusic::Record

หากต้องการอ้างอิงMusic::RecordจากMusic::EightTrackคุณสามารถใช้Recordเพราะกำหนดไว้ในขอบเขตเดียวกัน (ของMusic)

อย่างไรก็ตามเพื่อให้เข้าถึงRecordผู้รับผิดชอบโมดูลสำหรับการเชื่อมต่อกับฐานข้อมูลของคุณจากMusic::EightTrackคุณไม่สามารถใช้เพียงเพราะทับทิมคิดว่าคุณต้องการRecord Music::Recordนั่นคือเมื่อคุณจะใช้ประกอบการที่มีรายละเอียดขอบเขตเป็นคำนำหน้าระบุขอบเขตทั่วโลก / ::Recordหลัก:


12
ใช่คำตอบอย่างละเอียดมาก ขอบคุณ!
ma11hew28

11
คำตอบที่ยอดเยี่ยม FY ฉันไม่ต้องกังวลกับการสุ่มลงคะแนน ชีวิตมีอะไรที่มีความหมายมากกว่านี้
Darth Egregious

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โมดูลภายใน เพื่อให้ acess ไปนอกโมดูลจะใช้Net::Net


13

::ประกอบการหมายถึงขอบเขตทั่วโลกแทนท้องถิ่น


2
ขอบคุณ. ฉันยังพบคำอธิบายที่ผู้ประกอบการที่มีรายละเอียดขอบเขตในรูบี
ma11hew28
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.