::
предназначен для пространств имен, а .
предназначен для обозначения получателя при вызове метода.
Если у вас есть и константа, и метод класса с одинаковым именем в одном пространстве имен, например:
module Foo
Bar = 123
def self.Bar
456
end
end
тогда оператор разрешения области преобразуется в константу, а точка — в метод класса:
Foo::Bar
#=> 123
Foo.Bar
#=> 456
Это также верно, если константа относится к другому классу или модулю, который был определен в Foo
.
Если бы у вас был только Foo.Bar
, невозможно было бы получить константу Bar
.
Кроме того, вы можете ориентироваться на пространство имен верхнего уровня, используя оператор разрешения области в качестве префикса:
Bar = 123
module Foo
Bar = 456
def self.bars
[::Bar, Bar]
end
end
Foo.bars
#=> [123, 456]
В приведенном выше примере .Bar
поднимает SyntaxError
.
Наконец, ::
можно использовать для определения констант внутри пространства имен:
module Foo
end
module Foo::Bar
end
Foo::Bar::Baz = 123
module Foo.Bar
или Foo.Bar.Baz = 123
оба не сработают.
Отличный ответ. Большое спасибо.