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

Один вкладыш в string.rb

def is_integer?; true if Integer(self) rescue false end
395
задан sawa 26 November 2015 в 15:53
поделиться

5 ответов

:: - это, по сути, оператор разрешения пространства имен.Он позволяет вам получить доступ к элементам в модулях или элементам уровня класса в классах. Например, предположим, что у вас есть такая настройка:

module SomeModule
    module InnerModule
        class MyClass
            CONSTANT = 4
        end
    end
end

Вы можете получить доступ к CONSTANT извне модуля как SomeModule :: InnerModule :: MyClass :: CONSTANT .

Это не влияет на методы экземпляра, определенные в классе, поскольку вы обращаетесь к ним с другим синтаксисом (точка . ).

Соответствующее примечание: если вы хотите вернуться в пространство имен верхнего уровня, сделайте следующее: :: SomeModule - Benjamin Oakes

362
ответ дан 22 November 2019 в 23:32
поделиться

Нет, это не для доступа ко всем методам, это оператор «разрешения», то есть вы используете его для определения области (или местоположения, вы можете сказать) константного / статического символа.

Например, в первой строке Rails использует его для поиска базового класса внутри ActiveRecord.Module, во втором он используется для поиска метода класса (статического) класса Routes и т. Д. И т. Д.

Он не используется для раскрытия чего-либо, он используется для «определения местоположения» вещей вокруг ваших оптических прицелов.

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

11
ответ дан 22 November 2019 в 23:32
поделиться

:: Позволяет получить доступ к константе, модулю или классу, определенному внутри другого класса или модуля. Он используется для обеспечения пространств имен, чтобы имена методов и классов не конфликтовали с другими классами разных авторов.

Когда вы видите 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.

70
ответ дан 22 November 2019 в 23:32
поделиться

Что толку от scope (private, protected), если вы можете просто использовать :: для раскрытия чего угодно?

В Ruby все раскрыто и все может быть изменено из любого другого места.

Если вас беспокоит тот факт, что классы могут быть изменены за пределами "определения класса", то Ruby, вероятно, не для вас.

С другой стороны, если вас расстраивает закрытость классов Java, то Ruby, вероятно, то, что вы ищете.

24
ответ дан 22 November 2019 в 23:32
поделиться

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

Например, у вас может быть один метод под названием «run» в вашем коде, и вы по-прежнему сможете вызывать свой метод, а не метод «run», который был определен в какой-то другой библиотеке, с которой вы связались.

4
ответ дан 22 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: