我是Ruby的新手.我需要扩展Array,我需要我的类来表示二维数组.
我这样做了:
class MyExtension < Array
def initialize(n)
super(n, Array.new(n, nil))
self[0][0] = "hello"
end
end
Run Code Online (Sandbox Code Playgroud)
从理论上讲,这对我来说是正确的,但是当我这样做时:
p MyExtension.new(2)
Run Code Online (Sandbox Code Playgroud)
我明白了
[["hello", nil], ["hello", nil]]
Run Code Online (Sandbox Code Playgroud)
而不是预期的:
[["hello", nil], [nil, nil]]
Run Code Online (Sandbox Code Playgroud)
我错了什么?
这是初学者经常犯的常见错误.如果这样做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]]
Run Code Online (Sandbox Code Playgroud)