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

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

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

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

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

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

Отличный ответ. Большое спасибо.

cluster1 01.09.2024 16:30

Другие вопросы по теме