Что такое двойное двоеточие Руби`::'?
что это за двоеточие ::? Е. Г. Foo::Bar.
нашел определение:
The
::является унарным оператором, который позволяет: константы, методы экземпляра и методы класса, определенные в классе или модуле, для доступа из любого места за пределами класса или модуля.
что хорошего в scope (private, protected), если вы можете просто использовать :: что-нибудь выставить?
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.РБ)общее использование:: заключается в доступе к константам, определенным в модулях, например
module Math PI = 3.141 # ... end puts Math::PIThe
::оператор не позволяет обойти видимость методов, помеченных как частные или защищенные.
что хорошего в scope (private, protected), если вы можете просто использовать :: чтобы выставить что-нибудь?
в Ruby все открыто, и все может быть изменено из любого другого места.
Если вы беспокоитесь о том, что классы могут быть изменены вне "определения класса", то Ruby, вероятно, не для вас.
С другой стороны, если вы разочарованы тем, что классы Java заблокированы, то Ruby, вероятно, то, что вы ищете для.
нет, это не доступ к каждому методу, это оператор "разрешения", то есть вы используете его для разрешения области (или местоположения, которое вы можете сказать) постоянного/статического символа.
например, в первой строке Rails использует его для поиска базового класса внутри ActiveRecord.Модуль, во втором он используется для поиска метода класса (статического) класса маршрутов и т. д. и т. д.
Он не используется, чтобы выставить что-нибудь, его используют для "поиска" вещи вокруг вашего масштабы.
Это все о предотвращении столкновения определений с другим кодом, связанным с вашим проектом. Это означает, что вы можете держать вещи отдельно.
например, у вас может быть один метод с именем "run" в вашем коде, и вы все равно сможете вызвать свой метод, а не метод "run", который был определен в какой-то другой библиотеке, которую вы связали.
добавление к предыдущим ответам, это действительно рубиновый использовать
::для доступа к методам экземпляра. Допустимы все следующие действия: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
Comments