ajg*_*gon 3 ruby arrays reference
我正在尝试在Ruby中创建一个填充零的5x5矩阵.我使用的代码是:
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]]
Run Code Online (Sandbox Code Playgroud)
但是,新创建的数组不是单独的对象,而是对其中一个的引用.因此,当我尝试执行以下操作时: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]]
Run Code Online (Sandbox Code Playgroud)
这显然不是我想要的.检查对象ID确认它:
ruby-1.9.2-p290 :020 > a.collect {|z| z.__id__}.uniq
=> [70253724580020]
Run Code Online (Sandbox Code Playgroud)
我的问题是:它是一个bug还是一个功能?:)我应该如何正确创建数组?
我正在尝试在Ruby中创建一个填充零的5x5矩阵.我使用的代码是:
正如其他人所指出的那样,这就是数组应该如何工作的方式.相反,您应该使用块初始化程序:
a = Array.new(5) { Array.new(5, 0) }
Run Code Online (Sandbox Code Playgroud)
但是,如果您正在制作矩阵,请考虑在标准库中使用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
Run Code Online (Sandbox Code Playgroud)
实际上它是一个功能.
[...]它是用obj的大小副本创建的(也就是说,大小引用相同的obj)[...]
要创建不同的数组,您可以使用例如
a = Array.new(5){Array.new(5, 0)}
Run Code Online (Sandbox Code Playgroud)
要么
a = (1..5).map{Array.new(5, 0)}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1156 次 |
| 最近记录: |