Создать объект в определении класса - PullRequest
0 голосов
/ 11 октября 2018

Я хочу создать экземпляр ClassB внутри ClassA и присвоить его переменной @test3.

Это мой код:

module A
  module B
    class ClassA < Hash
      @test1 = Hash.new()
      @test2 = Object.new()
      @test3 = A::B::ClassB.new()

      def initialize(_name, _config = {})
        puts _name
        puts _config
        super()
      end
    end

    class ClassB < Hash
      def initialize(_config = {}, _parent = nil)
        puts _config
        puts _parent
        super()
      end
    end
  end
end

Возможноустановить @test3 в методе initialize, но у меня есть причины этого не делать.@test1 и @test2 работают, но я получаю сообщение об ошибке:

NameError: uninitialized constant A::B::ClassB

Почему это не работает?

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Причина в том, что ваш интерпретатор ruby ​​последовательно анализирует ваш файл, поэтому, когда он достигает определения @test3, ClassB все еще не объявляется.Если вы можете сделать это, проблему можно решить, определив ClassB перед ClassA, чтобы при определении @test3:

module A
  module B
    class ClassB < Hash
      def initialize(_config = {}, _parent = nil)
        puts _config
        puts _parent
        super()
      end
    end

    class ClassA < Hash
      @test1 = Hash.new()
      @test2 = Object.new()
      @test3 = A::B::ClassB.new()

      def initialize(_name, _config = {})
        puts _name
        puts _config
        super()
      end
    end 
  end
end
определялось classB.
0 голосов
/ 11 октября 2018

Интерпретатор Ruby выполняет коды построчно, в том числе внутри определения класса, об этом следует помнить.когда интерпретатор ruby ​​встречает @test3 = A::B::ClassB.new(), ClassB не был определен, вот почему вы получаете NameError.Чтобы устранить эту ошибку, вы должны переместить определение ClassB в начало ClassA.

0 голосов
/ 11 октября 2018

Вы используете ClassB перед его определением.Если вы переключаете порядок ClassA и ClassB, ваш код работает.

...