在Ruby中,这是一个二维数组错误



我有一个方法:

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文档以创建数组。

最新更新