Ruby - 继承自Array

wha*_*ide 1 ruby arrays

我是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)

我错了什么?

saw*_*awa 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]]
Run Code Online (Sandbox Code Playgroud)