Один вкладыш в string.rb
def is_integer?; true if Integer(self) rescue false end
::
- это, по сути, оператор разрешения пространства имен.Он позволяет вам получить доступ к элементам в модулях или элементам уровня класса в классах. Например, предположим, что у вас есть такая настройка:
module SomeModule
module InnerModule
class MyClass
CONSTANT = 4
end
end
end
Вы можете получить доступ к CONSTANT
извне модуля как SomeModule :: InnerModule :: MyClass :: CONSTANT
.
Это не влияет на методы экземпляра, определенные в классе, поскольку вы обращаетесь к ним с другим синтаксисом (точка .
).
Соответствующее примечание: если вы хотите вернуться в пространство имен верхнего уровня, сделайте следующее: :: SomeModule - Benjamin Oakes
Нет, это не для доступа ко всем методам, это оператор «разрешения», то есть вы используете его для определения области (или местоположения, вы можете сказать) константного / статического символа.
Например, в первой строке Rails использует его для поиска базового класса внутри ActiveRecord.Module, во втором он используется для поиска метода класса (статического) класса Routes и т. Д. И т. Д.
Он не используется для раскрытия чего-либо, он используется для «определения местоположения» вещей вокруг ваших оптических прицелов.
::
Позволяет получить доступ к константе, модулю или классу, определенному внутри другого класса или модуля. Он используется для обеспечения пространств имен, чтобы имена методов и классов не конфликтовали с другими классами разных авторов.
Когда вы видите 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.
Что толку от scope (private, protected), если вы можете просто использовать :: для раскрытия чего угодно?
В Ruby все раскрыто и все может быть изменено из любого другого места.
Если вас беспокоит тот факт, что классы могут быть изменены за пределами "определения класса", то Ruby, вероятно, не для вас.
С другой стороны, если вас расстраивает закрытость классов Java, то Ruby, вероятно, то, что вы ищете.
Все дело в предотвращении конфликтов определений с другим кодом, связанным с вашим проектом. Это означает, что вы можете хранить вещи отдельно.
Например, у вас может быть один метод под названием «run» в вашем коде, и вы по-прежнему сможете вызывать свой метод, а не метод «run», который был определен в какой-то другой библиотеке, с которой вы связались.