如何在Ruby中声明一个空的二维数组?

22

请问如何声明一个二维数组的新实例?大多数编程语言使用类似以下的方式:

array = Array.new[2][2]

我不知道如何在Ruby中实现它。


2
如果他想要高度和宽度都是1000,那将会非常繁琐。 - Mike Lewis
5个回答

47

你可以这样做:

width = 2
height = 3
Array.new(height){Array.new(width)} #=> [[nil, nil], [nil, nil], [nil, nil]] 

2
传统上,数组是按行主序排列的,即 [row, row row]。因此,您的示例应该交换高度和宽度,使其像这样:Array.new(height){Array.new(width)}。这样,您就可以使用 arrayInstance[row][column] 而不是 arrayInstance[column][row] 来访问元素。 - Kevin Wheeler

10

在Ruby中声明二维数组,使用以下语法并指定初始化值:

row, col, default_value = 5, 4, 0
arr_2d = Array.new(row){Array.new(col,default_value)}
=> [[0, 0, 0, 0], 
    [0, 0, 0, 0], 
    [0, 0, 0, 0], 
    [0, 0, 0, 0], 
    [0, 0, 0, 0]]

我们可以进行任意级别的嵌套,例如对于3维数组(5 x 4 x 2):您可以将块传递给最内部的数组以初始化数组

z = 2
arr_3d = Array.new(row){Array.new(col){Array.new(z){|index| index}}}
=> [[[0, 1], [0, 1], [0, 1], [0, 1]], 
    [[0, 1], [0, 1], [0, 1], [0, 1]], 
    [[0, 1], [0, 1], [0, 1], [0, 1]], 
    [[0, 1], [0, 1], [0, 1], [0, 1]], 
    [[0, 1], [0, 1], [0, 1], [0, 1]]]

现在,你可以使用 [] 运算符访问它的元素,例如 arr_2d[0][1],实际上它是一个数组的数组。


不知道你可以为数组指定默认元素。因此,您也可以将内部数组指定为外部数组的默认值:s = Array.new(3, Array.new(3, true)) => [[true,true,true],[true,true,true],[true,true,true]]哦,不,你不能。每行使用相同的数组。失败了。 - calasyr
在声明内部数组时,请使用{}而不是(),它会起作用。 - aqfaridi

4
您也可以通过传递一个值来进行初始化:
Array.new(3) { Array.new(3) { '0' } }

输出:

[
 ["0", "0", "0"], 
 ["0", "0", "0"], 
 ["0", "0", "0"]
]

3
您可以使用以下语法在Ruby中声明多维数组: Array.new(行数){Array.new(列数)} 如何使用这个语法 我们通过上面的例子来理解它,即array = Array.new[2][2]
因此,在这个例子中,我们需要声明一个具有2行2列的空多维数组。
现在让我们开始实现我们的语法, array = Array.new(2){Array.new(2)} 现在,您有一个包含2行2列和nil值的array
现在,array变量包含[[nil, nil], [nil, nil]] ,它被视为空多维数组nil值多维数组

-1
简单来说: array = Array.new(8,Array.new(8))

4
这并不是一个有效的方法。这会创建8个相同的数组副本,而不是8个不同的数组。 - Mark Kuczmarski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接