Что такое Ruby double-colon `::`?
Что это за двоеточие ::
? Например. Foo::Bar
.
Я нашел определение :
::
- это унарный оператор, который позволяет: константы, методы экземпляра и методы класса, определенные в классе или модуле, получить доступ из любого места вне класса или модуля.
Какая польза от области видимости (private, protected), если вы можете просто использовать ::
для публикации чего-либо?
Ответы
Ответ 1
::
- это в основном оператор разрешения пространства имен. Он позволяет вам получать доступ к элементам в модулях или элементам класса в классах. Например, скажем, что у вас была эта настройка:
module SomeModule
module InnerModule
class MyClass
CONSTANT = 4
end
end
end
Вы можете получить доступ к CONSTANT
извне модуля как SomeModule::InnerModule::MyClass::CONSTANT
.
Это не влияет на методы экземпляров, определенные в классе, поскольку вы обращаетесь к тем, у кого есть другой синтаксис (точка .
).
Соответствующее примечание. Если вы хотите вернуться в пространство имен верхнего уровня, сделайте следующее: SomeModule - Benjamin Oakes
Ответ 2
Этот простой пример иллюстрирует это:
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
Ответ 3
::
Позволяет вам получить доступ к константе, модулю или классу, определенным внутри другого класса или модуля. Он используется для предоставления пространств имен, так что имена методов и классов не конфликтуют с другими классами разными авторами.
Когда вы видите 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
Оператор ::
не позволяет обойти видимость методов, помеченных как private или protected.
Ответ 4
Какая польза от области видимости (закрытой, защищенной), если вы можете просто использовать:: для публикации чего-либо?
В Ruby все открыто, и все можно изменить из любого места.
Если вас беспокоит тот факт, что классы могут быть изменены извне "определения класса", тогда Ruby, вероятно, не для вас.
С другой стороны, если вы разочарованы тем, что классы Java блокируются, то Ruby, вероятно, вы ищете.
Ответ 5
Нет, это не доступ к каждому методу, это оператор "разрешения", то есть вы используете его для разрешения области (или местоположения, которую вы можете сказать) постоянного/статического символа.
Например, в первой строке вашей строки Rails использует ее для поиска базового класса внутри ActiveRecord.Module, а во втором - для определения метода класса (статического) класса Routes и т.д. и т.д.
Он не используется, чтобы разоблачить что-либо, его использовали, чтобы "найти" вещи вокруг ваших областей.
http://en.wikipedia.org/wiki/Scope_resolution_operator
Ответ 6
Все дело в том, чтобы запретить определениям конфликты с другим кодом, связанным с вашим проектом. Это означает, что вы можете держать вещи раздельными.
Например, у вас может быть один метод "run" в вашем коде, и вы все равно сможете вызывать свой метод, а не метод "run", который был определен в какой-либо другой библиотеке, в которую вы связали.
Ответ 7
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
Ответ 8
При добавлении к предыдущим ответам, Ruby должен использовать ::
для доступа к методам экземпляра. Все следующие действия:
MyClass::new::instance_method
MyClass::new.instance_method
MyClass.new::instance_method
MyClass.new.instance_method
В соответствии с лучшими практиками я считаю, что рекомендуется только последнее.
Ответ 9
module Amimal
module Herbivorous
EATER="plants"
end
end
Amimal::Herbivorous::EATER => "plants"
:: Используется для создания области. Чтобы получить доступ к Constant EATER из 2 модулей, нам нужно охватить модули, чтобы достичь константы