我对Ruby很新。
我需要扩展Array
,我需要我的类来表示二维数组。
我做到了这一点:
class MyExtension < Array
def initialize(n)
super(n, Array.new(n, nil))
self[0][0] = "hello"
end
end
这在理论上看起来对我来说,但是当我这样做时:
p MyExtension.new(2)
我得到了
[["hello", nil], ["hello", nil]]
而不是预期的:
[["hello", nil], [nil, nil]]
我出错了什么?
答案 0 :(得分:6)
这是初学者经常犯的常见错误。如果执行super(n, Array.new(n, nil))
,则Array.new(n, nil)
将仅评估一次,为每行提供相同的数组(相同的对象ID)。由于所有行都将重复相同的数组,因此修改self[0][0] = "hello"
行会改变所有其他行。
相反,做
class MyExtension < Array
def initialize(n)
super(n){Array.new(n, nil)}
self[0][0] = "hello"
end
end
MyExtension.new(2) # => [["hello", nil], [nil, nil]]