我想在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
为什么这不起作用?
答案 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
。如果您切换ClassA
和ClassB
的顺序,则代码将起作用。
答案 2 :(得分:0)
Ruby解释器逐行执行代码,包括在类的内部定义,您应该牢记这个想法。当ruby解释器遇到@test3 = A::B::ClassB.new()
时,尚未定义ClassB,这就是为什么出现NameError的原因。要消除此错误,您应该将ClassB的定义移到ClassA的前面。