1

我对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]]

我怎么了?

4

1 回答 1

8

这是初学者经常犯的常见错误。如果你这样做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]]
于 2013-10-08T23:02:39.753 回答