数组
一个数组是一种简单的固定长度的容器。数组中的每个元素具有相同的类型。数组的索引类型可以是任何序数类型。
数组可以通过[]构造:
type
IntArray = array[0..5, int] # an array that is indexed with 0..5
var
x: IntArray
x = [1, 2, 3, 4, 5, 6]
for i in low(x)..high(x):
echo(x[i])
标记x[i]是用来访问x的第i个元素。数组访问总是进行边界检查(在编译或者运行时)。这些检查可以禁用通过编译或调用编译器的命令行开关——bound_checks:off command line switch
数组是值类型,像其他nim类型,赋值操作将复制整个数组内容。
内置的len过程返回数组的长度。low(a)返回数组最小有效下标,high(a)返回数组最大有效下标。
type
Direction = enum
north, east, south, west
BlinkLights = enum
off, on, slowBlink, mediumBlink, fastBlink
LevelSetting = array[north..west, BlinkLights]
var
level: LevelSetting
level[north] = on
level[south] = slowBlink
level[east] = fastBlink
echo repr(level) # --> [on, fastBlink, slowBlink, off]
echo low(level) # --> north
echo len(level) # --> 4
echo high(level) # --> west
嵌套的数组语法在其他语言中是附加更多的括号,因为通常每个维度与其他限制相同的索引类型。在nim中你可以有不同的维度带有不同的索引类型,所以嵌套语法有些不一样。在前面的例子中,一个level被定义为一个数组枚举索引通过另一个枚举类型。我们可以添加以下的代码增加一个light tower类型在高度细分通过访问它们的整形索引:
type
LightTower = array[1..10, LevelSetting]
var
tower: LightTower
tower[1][north] = slowBlink
tower[1][east] = mediumBlink
echo len(tower) # --> 10
echo len(tower[1]) # --> 4
echo repr(tower) # --> [[slowBlink, mediumBlink, ...more output..
# The following lines don't compile due to type mismatch errors
#tower[north][east] = on
#tower[0][1] = on
注意:内置的built-in过程仅仅只返回数组的第一维的长度。另一种方式定义LightTower表现出更好的嵌套性质,将省略前面的LevelSetting类型的定义,相反将它直接嵌入作为第一维度的类型:
type
LightTower = array[1..10, array[north..west, BlinkLights]]
这是相当常见的数组从0开始,所以这是一个快捷的语法,指定一个范围从0到指定的下标值减一:
type
IntArray = array[0..5, int] # an array that is indexed with 0..5
QuickArray = array[6, int] # an array that is indexed with 0..5
var
x: IntArray
y: QuickArray
x = [1, 2, 3, 4, 5, 6]
y = x
for i in low(x)..high(x):
echo(x[i], y[i])
开放数组
- openarray类型不能被嵌套:多维的openarray不被支持因为这很少用到以及它不能有效的进行。