运维开发网

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

运维开发网 https://www.qedev.com 2020-07-31 15:50 出处:网络 作者:运维开发网整理
我正在尝试在 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]] 但是,新创建的数组不是单独的对象,而
我正在尝试在 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还是一个功能? :)我应该如何正确创建数组?

I’m trying to create a 5×5 matrix in Ruby filled with zeroes. The code I used was:

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

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
0

精彩评论

暂无评论...
验证码 换一张
取 消