Ruby: :: önek ne yapar?


91

Artifice'in kaynağını okuyordum ve şunu gördüm:

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

satır: https://github.com/wycats/artifice/blob/master/lib/artifice.rb#L6

Neden Net::HTTPbunun yerine sadece yapmıyorsunuz ::Net::HTTP, yani ::önek olarak kullandığınızda bu ne anlama geliyor ?


15
Bu konuyu "baştaki iki nokta üst üste" ifadesini kullanarak aradım ve başlangıçta bulamadım; umarım bu yorum bunu değiştirir. :)
Nathan Long

@NathanLong İlginç bir fikir. İşe yaradı mı? Lütfen geri bildirimde bulunun.
Darth Egregious

1
@NathanLong Çalıştı!
coreyward

Yanıtlar:


224

::Kapsam çözünürlük operatörüdür. Yaptığı şey, bir modülün hangi kapsamda bulunabileceğini belirlemektir. Örneğin:

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

Erişmek için Music::Recorddışından MusickullanırsınızMusic::Record .

Sizden referans Music::Recordalmak için Music::EightTrackkullanabilirsiniz Recordçünkü aynı kapsamda (kapsamı Music) tanımlanmıştır.

Ancak, Recordveritabanınız ile Music::EightTracksizden arabirim oluşturmaktan sorumlu modüle erişmek, RecordRuby istediğinizi düşündüğü için kullanamazsınız Music::Record. Eğer küresel / ana kapsamını belirten bir önek olarak kapsam çözünürlük operatörünü kullanırsınız o zaman: ::Record.


12
Evet, çok kapsamlı cevap. Teşekkürler!
ma11hew28

11
Mükemmel cevap. Bilginize Rastgele olumsuz oylar konusunda endişelenmiyorum. Hayatta çok daha anlamlı şeyler var.
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

Özel Artifice durumunda, gösterdiğiniz dosyanın 41. satırında bir iç Netmodül tanımlanmıştır . Dış Netmodüle erişimi korumak için kullanır ::Net.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.