Arrays 在Ruby中创建空子数组数组

Arrays 在Ruby中创建空子数组数组,arrays,ruby,multidimensional-array,Arrays,Ruby,Multidimensional Array,我想创建一个由n个不同的空子数组组成的数组 这是最好的方式吗 Array.new(n){ [] } 内容如下,但我在阅读评论后进行了修改: Array.new(n){ |_| [] } 我试过: Array.new(n, []) 但是它创建了一个数组,所有子数组都是同一个对象,这是我不想要的。array.new(n){[]}完全可以!该块确保数组的新实例被创建n次。正如您所指出的,否则您将引用同一对象(数组实例)n次。获得此数组的所有建议方法[]、[]、[]、[]、…]效果良好: Arra

我想创建一个由
n
个不同的空子数组组成的数组

这是最好的方式吗

Array.new(n){ [] }
内容如下,但我在阅读评论后进行了修改:

Array.new(n){ |_| [] }
我试过:

Array.new(n, [])

但是它创建了一个数组,所有子数组都是同一个对象,这是我不想要的。

array.new(n){[]}
完全可以!该块确保数组的新实例被创建n次。正如您所指出的,否则您将引用同一对象(数组实例)n次。

获得此数组的所有建议方法
[]、[]、[]、[]、…]
效果良好:

Array.new(n, []) # the best, 20 times faster
Array.new(n){ [] }
n.times.map { [] }
第一种是最快的,所以是最好的,但工作起来很奇怪(见下一步)

它创建了一个数组,所有子数组都是同一个对象

如果我明白了这一点,你的意思是,在所描述的方法中,会发生以下情况:

a = Array.new(5, [])
p a # => [[], [], [], [], [], [], [], [], [], []]
p a.map { |e| e.object_id} # => [70189488740180, 70189488740180, 70189488740180, 70189488740180, 70189488740180]]
对象是相同的,因此,如果尝试使用值填充子阵列,则所有子阵列都采用相同的值(复制):

要避免这种情况,请不要传递默认值,而是映射到空数组:

a = Array.new(5).map{ |e| [] }
p a # => [[], [], [], [], []]
或者通过街区

a = Array.new(5){ [] }
a = 5.times.map { [] }
现在,每个子阵列都是一个独立的对象:

p a.map { |e| e.object_id} # => [70253023825640, 70253023825620, 70253023825600, 70253023825580, 70253023825560]
如果插入一些值,则不会复制:

a[0][0] = 10
p a # => [[10], [10], [10], [10], [10]]
a[0][0] = 10
a[1][0] = 20
p a # => [[10], [20], [], [], []]

请试试这个。这对我有用

  n = 15
  arr = Array.new(n)
  arr.map!{ |x| x = [] }
现在,将值放入数组中

arr[0][0] = 10 
arr[5][0] = 50
p arr # => [[10], [], [], [], [], [50], [], [], [], [], [], [], [], [], []]

另一种方法:
n.times.map{| | |[]}
稍微简洁一点:
Array.new(n){[]}
闻起来像XY问题。也许你需要?@Neddy:还要注意的是,如果你有子数组-空或不空,“父”数组不是空的。“空子数组的空数组”是自相矛盾的。空数组不包含任何内容。
x=[]
中的赋值是多余的,您只需要
arr.map!{[]}
。这仅仅是
Array.new(n){[]}
在两行上。当您可以简单地将一个块传递给
new
时,为什么要使用
map
,如开头所示?@Stefan Ooops!编辑谢谢但我仍然不确定OP的问题是什么。最初的问题是“有没有比Array.new(n){| | |[]}更好的方法?”所以OP可能只是想知道是否有一种简写语法来创建空数组数组。这就是我要说的,我不确定是否有更正确的方法来实现这一点,但似乎没有。非常感谢。