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?

ma11hew28
quelle
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
1
@ NathanLong Es hat funktioniert!
Coreyward

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.

Coreyward
quelle
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.

Guilherme Bernal
quelle