Ruby - 继承自Array

时间:2013-10-08 22:58:31

标签: ruby arrays

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

我出错了什么?

1 个答案:

答案 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]]