Ruby覆盖数组类的初始化方法

时间:2014-11-10 10:48:56

标签: ruby arrays initialization override

基本上,我希望使用自己的方法拥有自己的类数组。

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

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

但是当我在IRB中测试时,我得到了这个:

a = Foo.new(5)
=> [] 

我也尝试过使用for循环用n次填充这个数组,但无济于事。

我做错了什么?

2 个答案:

答案 0 :(得分:4)

因为您从Array继承,所以可以这样做:

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

请注意,super会调用initialize上的原始Array方法。

Foo.new(5)
#=> [0, 0, 0, 0, 0]

答案 1 :(得分:3)

Class#new的实现看起来有点像这样:

class Class
  def new(*args, &block)
    obj = allocate
    obj.initialize(*args, &block)
    obj
  end
end

[注意:实际上,initializeprivate,因此需要反思调用,但是你明白了。]

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

如果您想更改new的返回值,则需要覆盖new。 (有点显而易见,你想不想?)但是在这种情况下,也可以简单地委托给超类的initialize,而且在{{1}}也是如此。 {3}}