Что такое 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 модулей, нам нужно охватить модули, чтобы достичь константы