Что это за двоеточие ::
? Например Foo::Bar
.
Я нашел определение :
Это
::
унарный оператор, который позволяет: константы, методы экземпляра и методы класса, определенные в классе или модуле, доступны из любой точки вне класса или модуля.
Что хорошего в сфере (приватной, защищенной), если вы можете просто использовать ::
что-либо для разоблачения?
Ответы:
::
в основном оператор разрешения пространства имен. Это позволяет вам получать доступ к элементам в модулях или элементам уровня класса в классах. Например, скажем, у вас была эта настройка:Вы можете получить доступ
CONSTANT
извне модуля какSomeModule::InnerModule::MyClass::CONSTANT
.Это не влияет на методы экземпляра, определенные в классе, так как вы обращаетесь к методам с другим синтаксисом (точка
.
).Соответствующее примечание: Если вы хотите вернуться к пространству имен верхнего уровня, сделайте это: :: SomeModule - Benjamin Oakes
источник
::
для разрешения пространства имен, напримерstd::cout << "Hello World!";
::SomeModule
Этот простой пример иллюстрирует это:
Взято с http://www.tutorialspoint.com/ruby/ruby_operators.htm
источник
::
Позволяет получить доступ к константе, модулю или классу, определенному внутри другого класса или модуля. Он используется для предоставления пространств имен, чтобы имена методов и классов не конфликтовали с другими классами разных авторов.Когда вы видите
ActiveRecord::Base
в Rails, это означает, что в Rails есть что-то вродет.е. класс, вызываемый
Base
внутри модуля, наActiveRecord
который затем ссылаются какActiveRecord::Base
(вы можете найти это в источнике Rails в activerecord-nnn / lib / active_record / base.rb)Обычно используется :: для доступа к константам, определенным в модулях, например
::
Оператор не позволяет обойти видимости методов отмечен частным или защищен.источник
class MyClass < ActiveRecord::Base
, значит ли это, что MyClass наследует только методы из базы классов, а не что-либо внутри модуля ActiveRecord?class Foo; Baz = 42; def self.Baz; "Baz method!"; end; end
(совершенно правильно)Foo::Baz # => 42
иFoo.Baz # => "Baz method!"
. Обратите внимание, чтоFoo::Baz()
(с круглыми скобками) также вызовет метод.В Ruby все выставлено, и все можно изменить из любого места.
Если вас беспокоит тот факт, что классы могут быть изменены вне «определения класса», то, вероятно, Ruby не для вас.
С другой стороны, если вы разочарованы блокировкой классов Java, то, вероятно, вы ищете Ruby.
источник
attr_accessor
просто создает методы, которые изменяют переменную. (Опять же естьinstance_eval
)instance_eval
. Но есть такжеinstance_variable_get
иinstance_variable_set
. Ruby слишком динамичен для ограничений.Добавление к предыдущим ответам позволяет использовать Ruby
::
для доступа к методам экземпляра. Все следующие действительны:В соответствии с лучшими практиками, я считаю, что рекомендуется только последний.
источник
Нет, это не доступ к каждому методу, это оператор «разрешения», то есть вы используете его для разрешения области (или местоположения, которую вы можете сказать) постоянного / статического символа.
Например, в первой строке Rails использует его для поиска класса Base внутри ActiveRecord.Module, во второй - для поиска метода класса (статического) класса Routes и т. Д., И т. Д.
Он не используется для разоблачения чего-либо, он используется для «локализации» вещей вокруг ваших областей.
http://en.wikipedia.org/wiki/Scope_resolution_operator
источник
Удивительно, но все 10 ответов здесь говорят об одном и том же. '::' является оператором разрешения пространства имен, и да, это правда. Но есть один момент, который вы должны понять, об операторе разрешения пространства имен, когда дело доходит до алгоритма постоянного поиска . Как подчеркивает Мац в своей книге «Язык программирования Ruby», постоянный поиск состоит из нескольких шагов. Во-первых, он ищет константу в лексическом контексте, на которую ссылается константа. Если он не находит константу в лексической области, он ищет иерархию наследования . Из-за этого алгоритма постоянного поиска ниже мы получаем ожидаемые результаты:
Хотя F наследуется от E, модуль B находится в лексической области действия F. Следовательно, экземпляры F будут ссылаться на константу PI, определенную в модуле B. Теперь, если модуль B не определил PI, тогда экземпляры F будут ссылаться на PI. константа, определенная в суперклассе E.
Но что, если бы мы использовали «::» вместо вложенных модулей? Получим ли мы такой же результат? Нет!
При использовании оператора разрешения пространства имен при определении вложенных модулей вложенные модули и классы больше не входят в лексическую область своих внешних модулей. Как вы можете видеть ниже, PI, определенный в A :: B, не входит в лексическую область A :: B :: C :: D, и поэтому мы получаем неинициализированную константу при попытке обратиться к PI в методе экземпляра get_pi:
источник
Это все о предотвращении столкновения определений с другим кодом, связанным с вашим проектом. Это означает, что вы можете держать вещи отдельно.
Например, в вашем коде может быть один метод с именем «run», и вы все равно сможете вызывать его, а не метод «run», определенный в какой-то другой библиотеке, с которой вы связались.
источник
:: Используется для создания области. Чтобы получить доступ к Constant EATER из 2 модулей, нам нужно настроить модули так, чтобы они доходили до постоянной
источник
Ruby on rails использует
::
для разрешения пространства имен.Чтобы использовать это:
Кроме того, другое использование: при использовании вложенных маршрутов
OmniauthCallbacksController
определяется под пользователями.И маршрутизируется как:
источник