gpt4 book ai didi

arrays - 嵌套数组的行为不同

转载 作者:数据小太阳 更新时间:2023-10-29 07:27:55 30 4
gpt4 key购买 nike

我正在创建一个嵌套数组来以两种不同的方式存储一些字母。第一种方式是这样的:

Array.new(rows, Array.new(columns){ O })

第二种方式是这样的:

Array.new(rows) do
Array.new(columns) { O }
end

它们看起来完全一样:

[["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", "0", "0", "0", "0"]]

当我想用另一个字母替换一个位置时:

array[1][3] = R

用第一种方式生成的数组,整个第一列将变成R。对于第二种方式,只有位置 [1][3] 将被替换为包含 R

我想知道这两种方式之间的区别是什么。

最佳答案

在您的第一个示例中:Array.new(rows, Array.new(columns){ O }),第二个参数指定数组的默认值作为对象引用。换句话说,在第一个示例中,您指定为每一行使用完全相同的对象,而在第二个 block 版本中,该表达式为每一行单独计算,为您提供可以独立更改的唯一对象。

参见此处:http://ruby-doc.org/core-2.2.0/Array.html#method-c-new-label-Common+gotchas

取自上面的链接:

When sending the second parameter, the same object will be used as the value for all the array elements:

a = Array.new(2, Hash.new)
# => [{}, {}]

a[0]['cat'] = 'feline'
a # => [{"cat"=>"feline"}, {"cat"=>"feline"}]

a[1]['cat'] = 'Felix'
a # => [{"cat"=>"Felix"}, {"cat"=>"Felix"}]

Since all the Array elements store the same hash, changes to one of them will affect them all.

If multiple copies are what you want, you should use the block version which uses the result of that block each time an element of the array needs to be initialized:

a = Array.new(2) { Hash.new }
a[0]['cat'] = 'feline'
a # => [{"cat"=>"feline"}, {}]

关于arrays - 嵌套数组的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48392956/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com