ruby中构造函数的NameError

时间:2010-12-30 13:43:13

标签: ruby constructor module

我正在尝试在实例变量中设置默认值。我在做:

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 - 则不会发生错误。我认为这表明它与模块位置无关。那么,怎么了?

2 个答案:

答案 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