В чем разница между String и :: String? - PullRequest
2 голосов
/ 16 февраля 2011

Я знаю, :: позволяет нам получать доступ к элементам в модулях или элементам уровня класса в классах, но что означает только ::String ??

В чем разница между String =="hi".class и ::String=="hi".class ??

Класс определяется следующим образом.

класс String

конец

Ответы [ 3 ]

6 голосов
/ 16 февраля 2011

::String относится к верхнему уровню String класса. String ссылается либо на строку в текущем пространстве имен, либо на пространства имен выше.

Взгляните на следующий код:

module MyModule
  class String
    def initialize(s); end

    def split(operator=nil)
      puts "This string doesn't split"
    end
  end

  class SomeClass
    def bar
       s = String.new("foo:bar")
       s.split(":")
    end

    def foo
       s = ::String.new("foo:bar")
       s.split(":")
    end
  end  

end

sc = MyModule::SomeClass.new

sc.foo
=> ["foo", "bar"]

sc.bar
This string doesn't split
=> nil

Поскольку String существует как в пространстве имен верхнего уровня, так и в модуле MyModule, вам необходимо явно ссылаться на строку верхнего уровня, используя пространство имен верхнего уровня ::.

5 голосов
/ 16 февраля 2011

В конкретном случае String против ::String ответ таков: примерно никогда не будет разницы.

В общем случае константы X против ::X, конечно. X может быть A::B::C::X или A::B::X или просто X, но ::X всегда "просто X", тогда как "X" может быть любым из них.

String очень важно, однако, так что никто не переопределит его случайно. В маловероятном случае, когда определен внутренний класс или модуль с именем String, наиболее вероятно, что содержащийся в нем код использует его, а не String.

Обновление: Я должен добавить, что простое видение class String; end не определяет класс String в том смысле, который, я думаю, вы имеете в виду. В Ruby классы могут быть открыты заново. Ключевое слово class может содержать или не содержать новый класс. Это может быть просто добавление поведения к существующему, и если внутри ничего нет, то это просто запрет. Поведение старого класса все еще там,

2 голосов
/ 16 февраля 2011

Это означает «доступ к строковой константе из пространства имен верхнего уровня».

Строка класса может быть определена в некотором модуле - это скажет интерпретатору доступ к классу в пространстве имен верхнего уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...