嵌套数组的行为不同

空作家

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

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 }),第二个参数指定数组的默认值作为对象引用换句话说,在第一个示例中,您指定为每行使用相同的精确对象,而在第二个块版本中,将为每行分别评估该表达式,从而为您提供可以独立更改的唯一对象。

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

来自上面的链接:

发送第二个参数时,相同的对象将用作所有数组元素的值:

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

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

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

由于所有Array元素都存储相同的哈希,因此对其中之一进行更改将影响它们。

如果需要多个副本,则应使用块版本,该块版本每次需要初始化数组的元素时都使用该块的结果:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章