Ruby: Was macht :: Präfix?


87

Ich las die Quelle von Artifice durch und sah:

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

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

Warum nicht einfach tun, Net::HTTPanstatt ::Net::HTTP, was bedeutet es, wenn Sie ::als Präfix verwenden?


15
Ich habe nach diesem Thema mit dem Ausdruck "führende Doppelpunkte" gesucht und es anfangs nicht gefunden. hoffentlich wird dieser Kommentar das ändern. :)
— Nathan Long

@ NathanLong Interessante Idee. Hat es funktioniert? Bitte melden Sie sich zurück.
— Darth Egregious

Antworten:


214

Dies ::ist der Operator für die Bereichsauflösung. Es bestimmt, unter welchem ​​Bereich sich ein Modul befindet. Beispielsweise:

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

Für den Zugriff Music::Recordvon außerhalb Musicwürden Sie verwenden Music::Record.

Zum Verweisen Music::Recordvon Music::EightTrackIhnen könnte einfach verwendet werden, Recordda es im selben Bereich (dem von Music) definiert ist.

Der Zugriff auf das RecordModul, das für die Schnittstelle mit Ihrer Datenbank verantwortlich ist Music::EightTrack, kann jedoch nicht einfach verwendet werden, Recordda Ruby dies für erforderlich hält Music::Record. In diesem Fall würden Sie den Bereichsauflösungsoperator als Präfix verwenden und den globalen / Hauptbereich angeben : ::Record.


12
Ja, sehr gründliche Antwort. Vielen Dank!
— ma11hew28

11
Hervorragende Antwort. Zu Ihrer Information, ich mache mir keine Sorgen über zufällige Abstimmungen. Es gibt viel bedeutungsvollere Dinge im Leben.
— 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

Im speziellen Fall von Artifice wird in Zeile 41 der von Ihnen gezeigten Datei ein inneres NetModul definiert . Um Zugang zum äußeren NetModul zu erhalten, wird es verwendet ::Net.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.