Ruby重写数组类的初始化方法

Ruby重写数组类的初始化方法,ruby,arrays,initialization,overriding,Ruby,Arrays,Initialization,Overriding,基本上,我希望有我自己的数组类和我自己的方法 我想通过传递一个数组长度的参数来初始化它,它应该实例化一个具有给定长度并用零填充的新数组。所以我写了这样的东西: class Foo < Array def initialize(length) Array.new(length, 0) end end 我还尝试使用for循环n次用零填充这个数组,但没有成功 我做错了什么?因为您继承了阵列,所以可以执行以下操作: class Foo < Array def initi

基本上,我希望有我自己的数组类和我自己的方法

我想通过传递一个数组长度的参数来初始化它,它应该实例化一个具有给定长度并用零填充的新数组。所以我写了这样的东西:

class Foo < Array
  def initialize(length)
    Array.new(length, 0)
  end
end
我还尝试使用for循环n次用零填充这个数组,但没有成功


我做错了什么?

因为您继承了阵列,所以可以执行以下操作:

class Foo < Array
  def initialize(length)
    super(length, 0)
  end
end

由于从阵列继承,因此可以执行以下操作:

class Foo < Array
  def initialize(length)
    super(length, 0)
  end
end
Classnew的实现有点像这样:

class Class
  def new(*args, &block)
    obj = allocate
    obj.initialize(*args, &block)
    obj
  end
end
[注意:实际上,initialize是私有的,因此需要以反射的方式调用它,但您知道这一点。]

IOW:initialize的返回值被完全忽略

如果要更改new的返回值,则需要覆盖new。有点明显,你不觉得吗?但是在这种情况下,简单地委托给超类的initialize也是可能的,而且通常是一个好主意,如中所示。

Classnew的实现看起来有点像这样:

class Class
  def new(*args, &block)
    obj = allocate
    obj.initialize(*args, &block)
    obj
  end
end
[注意:实际上,initialize是私有的,因此需要以反射的方式调用它,但您知道这一点。]

IOW:initialize的返回值被完全忽略

如果要更改new的返回值,则需要覆盖new。有点明显,你不觉得吗?但是在这种情况下,简单地委托给超类的initialize也是可能的,并且通常是一个好主意,如中所示