如何创建包含数组副本的数组

时间:2013-11-30 00:01:50

标签: ruby arrays

我无法找到构建数组的方法,例如

[  [1,2,3] , [1,2,3] , [1,2,3] , [1,2,3] , [1,2,3]  ]

给定[1,2,3]和数字5。我猜数组上有某种运算符,例如product mult,但doc中没有运算符。请告诉我。我错过了很简单的事情。

2 个答案:

答案 0 :(得分:8)

Array.new(5, [1, 2, 3]) Array.new(5) { [1, 2, 3] }

Array.new(size, default_object)创建一个初始大小的数组,并使用您指定的默认对象填充。请记住,如果你改变任何嵌套数组,你会改变所有,因为每个元素都是对同一个对象的引用

array = Array.new(5, [1, 2, 3])
array.first << 4
array # => [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]

Array.new(size) { default_object }可让您使用单独的对象创建数组。

array = Array.new(5) { [1, 2, 3] }
array.first << 4
array #=> [[1, 2, 3, 4], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]] 

the page you linked to的最顶部,在标题为“Creating Arrays”的部分下查找更多创建数组的方法。

答案 1 :(得分:4)

为什么不使用:

[[1, 2, 3]] * 5 
# => [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]

Array.*的文档说:

  

...返回通过连接自我的int个副本构建的新数组。

通常我们想要创建一个重复的单级数组:

[1, 2, 3] * 2 
# => [1, 2, 3, 1, 2, 3]

但没有什么可说的,我们不能像上面那样使用子数组。


  

看起来变异其中一个子阵列会改变所有子阵列,但这可能是某人想要的。

就像Array.new(5, [1,2,3])

foo = [[1, 2, 3]] * 2
foo[0][0] = 4
foo # => [[4, 2, 3], [4, 2, 3]]

foo = Array.new(2, [1,2,3])
foo[0][0] = 4
foo # => [[4, 2, 3], [4, 2, 3]]

解决方法,如果不是所需的行为是:

foo = ([[1, 2, 3]] * 2).map { |a| [*a] }
foo[0][0] = 4
foo # => [[4, 2, 3], [1, 2, 3]]

但是,在那时它不那么方便,所以我会使用默认的Array.new(n) {…}行为。