我有一个方法:
def test
f = Array.new(4,Array.new(4,false))
f.each do |array|
p array.inspect
end
f[1][1] = true
p "after setting f[1][1]"
f.each do |array|
p array.inspect
end
end
这是输出:
"[false, false, false, false]"
"[false, false, false, false]"
"[false, false, false, false]"
"[false, false, false, false]"
"after setting f[1][1]"
"[false, true, false, false]"
"[false, true, false, false]"
"[false, true, false, false]"
"[false, true, false, false]"
您可以看到col 1中的所有值变得正确,为什么会发生这种情况???
它不是错误。Array.new(4, Array.new(4,false))
创建一个由4个元素组成的数组,其中每个元素均为相同数组对象,由单个调用Array.new(4, false)
确定。对于f
的每个元素,它不会执行Array.new(4,false)
4次。因此,您最终将f
作为对同一对象的4个引用的数组(一个4元素数组,[false, false, false, false]
)。
如果您想拥有4个不同的4个元素阵列的数组,则有很多方法可以在Ruby中进行此操作。一种方法是:
f = Array.new(4) { Array.new(4, false) }
这将为您的Array.new(4)
中的每个条目分别执行Array.new(4, false)
。
2.4.0 :002 > f = Array.new(4) { Array.new(4, false) }
=> [[false, false, false, false], [false, false, false, false], [false, false, false, false], [false, false, false, false]]
2.4.0 :003 > f.each do |array|
2.4.0 :004 > p array.inspect
2.4.0 :005?> end
"[false, false, false, false]"
"[false, false, false, false]"
"[false, false, false, false]"
"[false, false, false, false]"
=> [[false, false, false, false], [false, false, false, false], [false, false, false, false], [false, false, false, false]]
2.4.0 :006 > f[1][1] = true
=> true
2.4.0 :007 > p "after setting f[1][1]"
"after setting f[1][1]"
=> "after setting f[1][1]"
2.4.0 :008 > f.each do |array|
2.4.0 :009 > p array.inspect
2.4.0 :010?> end
"[false, false, false, false]"
"[false, true, false, false]"
"[false, false, false, false]"
"[false, false, false, false]"
=> [[false, false, false, false], [false, true, false, false], [false, false, false, false], [false, false, false, false]]
2.4.0 :011 >
供参考,请参阅Ruby文档以创建数组。