初始化中的ruby super关键字抛出ArgumentError

时间:2015-06-03 09:20:22

标签: ruby oop

我正在从基于ruby 1.9的书中学习ruby,但目前我正在使用2.2

我有两个班级(来自书中)

class Point
    def initialize(x,y)
        @x,@y = x,y
    end
end

class Point3D < Point
    def initialize(x,y,z)
        super(x,y)
        @z = z
    end
end

然而,当我致电Point3D.new(0,1,2)时,红宝石翻译会引发ArgumentError wrong number of arguments (3 for 2)

为什么会这样?

修改

我省略了说Point类在另一个require d文件中。

我试过打电话

require "./Point.rb"

point = Point.new(0,1)
puts point

按预期工作

然后按照描述添加了Point3D类并尝试调用

require "./Point.rb"

class Point3D < Point
...
end

point1 = Point3D.new(0,1,2)
puts point1

引发了ArgumentError。

如果我将这两个类放在同一个文件中(Point3D.rb)但是这个问题不会发生,但是如果我将Point3D类放在Point.rb中,则错误仍然存​​在。

1 个答案:

答案 0 :(得分:0)

我明白了问题所在。

本书就如何创建initialize重载

做了一个例子
class Point
    def initialize(x,y)
        @x,@y = x,y
    end

    def self.new(x,y)
        #other stuff
        super
    end
end

并且错过了来自super

Point3D来电

我评论过self.newPoint正在按预期工作。

有趣的是,如果您在文件 Point.rb 中添加Point方法,就像这样

class << Point
    def to_s
        "foo"
    end
end

Point.rb正常工作。