我正在尝试在实例变量中设置默认值。我在做:
module MyModule::MyOtherModule
class MyClass
attr_accessor :point
def initialize
@point = Point.new(0,1)
end
end
end
module MyModule
class Point
attr_accessor :x, :y
def initialize(x, y)
@x = x
@y = y
end
end
end
Point也是我写的一堂课。有趣的是,每当我运行这个样本时,我得到:
uninitialized constant MyModule::MyOtherModule::MyClass::Point (NameError)
但是,如果我将赋值移动到另一个方法而不是构造函数 - 比如foo - 则不会发生错误。我认为这表明它与模块位置无关。那么,怎么了?
答案 0 :(得分:2)
模块=!模块
Class =!类
在这种情况下,Module和Class是Ruby中的常量,所以本质上这个代码是不正确的。正确的模块和类构造是向下的。那是第一次。
其次,要回答您的问题,我们需要了解Point类定义的外观,以及如何实例化MyClass。消息很明显:uninitialized constant
,它无法在范围内的任何位置找到Point。
修改
module MyModule
module MyOtherModule
class MyClass
attr_accessor :point
def initialize
#as mentioned by nas
@point = MyModule::Point.new(0,1)
end
end
end
end
module MyModule
class Point
attr_accessor :x, :y
def initialize(x, y)
@x = x
@y = y
end
end
end
obj = MyModule::MyOtherModule::MyClass.new()
puts obj.point.x #=> 0
puts obj.point.y #=> 1
答案 1 :(得分:2)
由于您的Point类在MyModule的范围内,因此最佳做法是像MyModule::Point
那样访问它。 MyClass构造函数稍有变化:
def initialize
@point = MyModule::Point.new(0,1)
end