在类定义中创建对象

时间:2018-10-11 11:54:49

标签: ruby class instance-variables

我想在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 :(得分:3)

原因是您的ruby解释器按顺序分析您的文件,因此当到达@test3定义时,ClassB仍未声明。 如果可以,可以通过在ClassB之前定义ClassA来解决此问题,以便在定义classB时定义@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

答案 1 :(得分:1)

在定义之前,您正在使用ClassB。如果您切换ClassAClassB的顺序,则代码将起作用。

答案 2 :(得分:0)

Ruby解释器逐行执行代码,包括在类的内部定义,您应该牢记这个想法。当ruby解释器遇到@test3 = A::B::ClassB.new()时,尚未定义ClassB,这就是为什么出现NameError的原因。要消除此错误,您应该将ClassB的定义移到ClassA的前面。