ruby中的数组数组,通过引用传递

我正在尝试在Ruby中创建一个填充零的5×5矩阵。 我使用的代码是:

ruby-1.9.2-p290 :014 > a = Array.new(5, Array.new(5, 0)) => [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 

但是,新创建的数组不是单独的对象,而是对一个对象的引用。 因此,当我尝试执行以下操作时: a[2][2] = 1我得到:

 => [[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0]] 

这显然不是我想要的。 检查对象ID确认它:

 ruby-1.9.2-p290 :020 > a.collect {|z| z.__id__}.uniq => [70253724580020] 

我的问题是:它是一个bug还是一个function? :)我应该如何正确创建数组?

我正在尝试在Ruby中创建一个填充零的5×5矩阵。 我使用的代码是:

正如其他人所指出的那样,这就是数组应该如何工作的方式。 相反,您应该使用块初始化程序:

 a = Array.new(5) { Array.new(5, 0) } 

但是,如果您正在制作矩阵,请考虑在标准库中使用Matrix类

 require 'matrix' # => true m = Matrix.build(5, 5) { 0 } # => Matrix[[0, 0, 0, 0, 0], # [0, 0, 0, 0, 0], # [0, 0, 0, 0, 0], # [0, 0, 0, 0, 0], # [0, 0, 0, 0, 0]] m.determinant # => 0 

实际上它是一个function 。

[…]它是用obj的 大小副本创建的(也就是说, 大小引用相同的obj )[…]

要创建不同的数组,您可以使用例如

 a = Array.new(5){Array.new(5, 0)} 

要么

 a = (1..5).map{Array.new(5, 0)}