Что такое двойная двоеточие Руби`::`?

что такое двойное двоеточие ::? Е. Г. 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.Модуль, во втором он используется для поиска метода класса (статического)класса маршрутов и т. д. и т. д.

Он не используется для разоблачения чего-либо, его используют для "поиска" материала вокруг вашего масштабы.

http://en.wikipedia.org/wiki/Scope_resolution_operator


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

например, у вас может быть один метод под названием "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