В чем преимущество наличия в языке оператора разрешения области?

Например: puts FileManagement::CSV.Reader.new

Почему бы и нет: puts FileManagement.CSV.Reader.new?

Почему такая дифференциация? В чем преимущество наличия дополнительного оператора ::-?

🤔 А знаете ли вы, что...
Ruby поддерживает работу с базами данных через множество адаптеров, таких как ActiveRecord.


1
50
1

Ответ:

Решено

:: предназначен для пространств имен, а . предназначен для обозначения получателя при вызове метода.

Если у вас есть и константа, и метод класса с одинаковым именем в одном пространстве имен, например:

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 оба не сработают.