在 class 定义中创建对象

Create object within class definition

我想在 ClassA 中创建一个 ClassB 的实例,并将其分配给变量 @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

可以在initialize方法中设置@test3,但我有理由不这样做。 @test1@test2 有效,但出现错误:

NameError: uninitialized constant A::B::ClassB

为什么这不起作用?

您在定义它之前使用了 ClassB。如果您切换 ClassAClassB 的顺序,您的代码就可以工作。

原因是你的ruby解释器按顺序解析你的文件,所以当它到达@test3定义时,ClassB仍然没有声明。 如果可以的话,可以通过在 ClassA 之前定义 ClassB 来解决问题,这样在定义 @test3 时定义 classB:

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

Ruby 解释器逐行执行代码,包括里面的 class 定义,你应该记住这个想法。当 ruby 解释器遇到 @test3 = A::B::ClassB.new() 时,ClassB 还没有被定义,这就是你得到 NameError 的原因。要消除这个错误,您应该将ClassB的定义移到ClassA的前面。