基本上,我希望使用自己的方法拥有自己的类数组。
我想通过传递一个数组长度的争论来初始化它,它应该实例化一个给定长度并填充零的新数组。所以我写了这样的话:
class Foo < Array
def initialize(length)
Array.new(length, 0)
end
end
但是当我在IRB中测试时,我得到了这个:
a = Foo.new(5)
=> []
我也尝试过使用for循环用n次填充这个数组,但无济于事。
我做错了什么?
答案 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
[注意:实际上,initialize
是private
,因此需要反思调用,但是你明白了。]
IOW:完全忽略initialize
的返回值。
如果您想更改new
的返回值,则需要覆盖new
。 (有点显而易见,你想不想?)但是在这种情况下,也可以简单地委托给超类的initialize
,而且在{{1}}也是如此。 {3}}