Ruby: синтаксис для определения константы внутри структуры - PullRequest
0 голосов
/ 11 декабря 2018

Рассмотрим следующую (правильную) программу на Ruby:

class Outer

  Inner = Struct.new(:dummy) do
    CONST = 'abce'
    def fun
      puts(dummy)
    end
  end

end

obj = Outer::Inner.new(15)
obj.fun
puts(Outer::CONST)

Почему я должен писать Outer::CONST вместо Outer::Inner::CONST?

Мое понимание блока, переданного в Struct::new, заключалось в том, что self связан с Outer::Inner, и действительно, мы можем видеть, что метод (fun) присоединен к классу Inner;но CONST явно нет.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Это происходит потому, что константа определена в текущем пространстве имен .Ключевые слова class и module определяют пространства имен, а Struct.new (как и Class.new) - нет.

Чтобы определить константу в области действия структуры, необходимо использовать self::

class Outer
  Inner = Struct.new(:dummy) do
    self::CONST = 'abce'
  end
end

Outer::Inner::CONST
#=> 'abce'

Outer::CONST
#=> NameError uninitialized constant Outer::CONST
0 голосов
/ 11 декабря 2018

После небольшого копания я смог понять это.Вот цитата из подобного вопроса :

Константы принадлежат классам, поэтому постоянное разрешение с помощью оператора :: работает только с объектами класса.

В приведенном выше примере Inner является константой, а не классом, поэтому Outer::Inner::CONST не будет работать.Если мы переопределим Inner как класс, мы увидим ожидаемые результаты.

class Outer

  class Inner
    CONST = 'abce'
    Deeper = Struct.new(:dummy) do
      def fun
        puts(dummy)
      end
    end
  end

end

obj = Outer::Inner::Deeper.new(15)
obj.fun
puts(Outer::Inner::CONST)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...