在 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
。如果您切换 ClassA
和 ClassB
的顺序,您的代码就可以工作。
原因是你的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的前面。
我想在 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
。如果您切换 ClassA
和 ClassB
的顺序,您的代码就可以工作。
原因是你的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的前面。