我无法找到构建数组的方法,例如
[ [1,2,3] , [1,2,3] , [1,2,3] , [1,2,3] , [1,2,3] ]
给定[1,2,3]
和数字5
。我猜数组上有某种运算符,例如product
mult
,但doc中没有运算符。请告诉我。我错过了很简单的事情。
答案 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) {…}
行为。