数组

数组是固定长度的容器。数组中的元素具有相同的类型。数组索引类型可以是任意序数类型。

数组可以用 [] 来构造:

  1. type
  2. IntArray = array[0..5, int] # 一个索引为0..5的数​组
  3. var
  4. x: IntArray
  5. x = [1, 2, 3, 4, 5, 6]
  6. for i in low(x)..high(x):
  7. echo x[i]

x[i] 标记用来访问 x 的第i个元素。数组访问总是有边界检查的 (编译期或运行时)。这些检查可以通过pragmas或调用编译器的命令行开关 —bound_checks:off 来关闭。

数组是值类型,和任何其它Nim类型一样。赋值操作符拷贝整个数组内容。

内置 len 过程返回数组长度。 low(a) 返回数组a的最小索引, high(a) 返回最大索引。

  1. type
  2. Direction = enum
  3. north, east, south, west
  4. BlinkLights = enum
  5. off, on, slowBlink, mediumBlink, fastBlink
  6. LevelSetting = array[north..west, BlinkLights]
  7. var
  8. level: LevelSetting
  9. level[north] = on
  10. level[south] = slowBlink
  11. level[east] = fastBlink
  12. echo repr(level) # --> [on, fastBlink, slowBlink, off]
  13. echo low(level) # --> north
  14. echo len(level) # --> 4
  15. echo high(level) # --> west

嵌套数组的语法,即其它语言中的多维数组,实际上是追加更多中括号因为通常每个维度限制为和其它一样的索引类型。 在Nim中你可以在不同的维度有不同索引类型,所以嵌套语法稍有不同。 基于上面的例子,其中层数定义为枚举的数组被另一个枚举索引,我们可以添加下面的行来添加一个在层数上进行再分割的灯塔类型:

  1. type
  2. LightTower = array[1..10, LevelSetting]
  3. var
  4. tower: LightTower
  5. tower[1][north] = slowBlink
  6. tower[1][east] = mediumBlink
  7. echo len(tower) # --> 10
  8. echo len(tower[1]) # --> 4
  9. echo repr(tower) # --> [[slowBlink, mediumBlink, ...more output..
  10. # 下面的行不能编译因为类型不匹配
  11. #tower[north][east] = on
  12. #tower[0][1] = on

注意内置 len 过程如何只返回数组的第一维长度。另一个定义 LightTower 的方法来更好的说明它的嵌套本质是忽略上面定义的 LevelSetting 类型,取而代之是直接将它以第一维类型嵌入。

  1. type
  2. LightTower = array[1..10, array[north..west, BlinkLights]]

从零开始对数组很普遍,有从零到指定索引减1的范围简写语法:

  1. type
  2. IntArray = array[0..5, int] # 一个索引为0..5的数​组
  3. QuickArray = array[6, int] # 一个索引为0..5的数​组
  4. var
  5. x: IntArray
  6. y: QuickArray
  7. x = [1, 2, 3, 4, 5, 6]
  8. y = x
  9. for i in low(x)..high(x):
  10. echo x[i], y[i]