Что такое двойная двоеточие Руби`::`?
что такое двойное двоеточие ::
? Е. Г. Foo::Bar
.
нашел определение:
на
::
- унарный оператор, который позволяет: константы, методы экземпляра и методы класса, определенные в классе или модуле, доступны из любого места вне класса или модуля.
что хорошего в области (частная, защищенная), если вы можете просто использовать ::
что-нибудь выставить?
9 ответов
::
в основном оператор разрешения пространства имен. Это позволяет получить доступ к элементам в модулях, или класса предметов в классах. Например, скажем, у вас была эта настройка:
module SomeModule
module InnerModule
class MyClass
CONSTANT = 4
end
end
end
можно использовать CONSTANT
снаружи модуля как SomeModule::InnerModule::MyClass::CONSTANT
.
это не влияет на методы экземпляра, определенные в классе, так как вы получаете доступ к методам с другим синтаксисом (точка .
).
соответствующее примечание: Если вы хотите вернуться в пространство имен верхнего уровня, сделайте это: ::SomeModule – Бенджамин Оукс
этот простой пример иллюстрирует это:
MR_COUNT = 0 # constant defined on main Object class
module Foo
MR_COUNT = 0
::MR_COUNT = 1 # set global count to 1
MR_COUNT = 2 # set local count to 2
end
puts MR_COUNT # this is the global constant
puts Foo::MR_COUNT # this is the local "Foo" constant
взято из http://www.tutorialspoint.com/ruby/ruby_operators.htm
::
позволяет получить доступ к постоянной, модуль или класс, определенный внутри другого класса или модуля. Он используется для предоставления пространств имен, чтобы имена методов и классов не конфликтовали с другими классами разных авторов.
когда вы видите ActiveRecord::Base
в Rails это означает, что Rails имеет что-то вроде
module ActiveRecord
class Base
end
end
т. е. класс Base
в модуле ActiveRecord
, который затем упоминается как ActiveRecord::Base
(вы можете найти это в источнике Rails в activerecord-n.n.n / lib/active_record / base.rb)
общее использование:: для доступа к константам, определенным в модулях, например
module Math
PI = 3.141 # ...
end
puts Math::PI
The ::
оператор не позволяет обойти видимость методов, помеченных как частные или защищенные.
что хорошего в scope (private, protected), если вы можете просто использовать :: для раскрытия чего-либо?
в Ruby все выставляется, и все может быть изменено из любого места.
Если вы беспокоитесь о том, что классы могут быть изменены вне "определения класса", то Ruby, вероятно, не для вас.
С другой стороны, если вы разочарованы тем, что классы Java заблокированы, то Ruby, вероятно, то, что вы ищете для.
нет, это не для доступа к каждому методу, это оператор "разрешения", то есть вы используете его для разрешения области (или местоположения, которое вы можете сказать) постоянного/статического символа.
например, в первой из ваших строк Rails использует его для поиска базового класса внутри ActiveRecord.Модуль, во втором он используется для поиска метода класса (статического)класса маршрутов и т. д. и т. д.
Он не используется для разоблачения чего-либо, его используют для "поиска" материала вокруг вашего масштабы.
Это все о предотвращении столкновения определений с другим кодом, связанным с вашим проектом. Это значит, что вы можете держать вещи отдельно.
например, у вас может быть один метод под названием "run" в вашем коде, и вы все равно сможете вызвать свой метод, а не метод "run", который был определен в какой-либо другой библиотеке, с которой вы связаны.
добавление к предыдущим ответам, это действительно Ruby использовать ::
для доступа к методам экземпляра. Допустимы все следующие действия:
MyClass::new::instance_method
MyClass::new.instance_method
MyClass.new::instance_method
MyClass.new.instance_method
в соответствии с лучшими практиками я считаю, что рекомендуется только последний.
module Amimal
module Herbivorous
EATER="plants"
end
end
Amimal::Herbivorous::EATER => "plants"
:: используется для создания объема . Чтобы получить доступ к Constant EATER из 2 модулей, нам нужно охватить модули, чтобы достичь константы
Ruby on rails использует:: для разрешения пространства имен.
class User < ActiveRecord::Base
VIDES_COUNT = 10
Languages = { "English" => "en", "Spanish" => "es", "Mandarin Chinese" => "cn"}
end
использовать :
User::VIDEOS_COUNT
User::Languages
User::Languages.values_at("Spanish") => "en"
кроме того, другое использование: при использовании вложенных маршрутов
OmniauthCallbacksController
определен в разделе пользователи.
и так :
devise_for :users, controllers: {omniauth_callbacks: "users/omniauth_callbacks"}
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
end