数组和序列类型
数组是同类型的,这意味着数组中的每个元素都具有相同的类型。 数组总是具有指定为常量表达式的固定长度(开放数组除外)。 它们可以按任何序数类型索引。 参数 A 可以是 开放数组 ,在这种情况下,它由0到 len(A)- 1 的整数索引。 数组表达式可以由数组构造函数 [] 构造。 数组表达式的元素类型是从第一个元素的类型推断出来的。 所有其他元素都需要隐式转换为此类型。
序列类似于数组,但动态长度可能在运行时期间发生变化(如字符串)。 序列实现为可增长的数组,在添加项目时分配内存块。 序列 S 始终用从0到 len(S)-1 的整数索引,并检查其边界。 序列可以由数组构造函数 [] 和数组一起构造,以序列运算符 @ 。 为序列分配空间的另一种方法是调用内置的 newSeq 过程。
序列可以传递给 开放数组 类型的参数。
示例:
- type
- IntArray = array[0..5, int] # an array that is indexed with 0..5
- IntSeq = seq[int] # a sequence of integers
- var
- x: IntArray
- y: IntSeq
- x = [1, 2, 3, 4, 5, 6] # [] is the array constructor
- y = @[1, 2, 3, 4, 5, 6] # the @ turns the array into a sequence
- let z = [1.0, 2, 3, 4] # the type of z is array[0..3, float]
数组或序列的下限可以由内置的proc low() 接收,上限由 high() 接收。 长度可以由 len() 接收。序列或开放数组的 low() 总是返回0,因为这是第一个有效索引。 可以使用 add() proc或 & 运算符将元素追加到序列中,并使用 pop() proc删除(并获取)序列的最后一个元素。
符号 x [i] 可用于访问 x 的第i个元素。
数组始终是边界检查(静态或运行时)。可以通过编译指示禁用这些检查,或使用 —boundChecks:off 命令行开关调用编译器。
数组构造函数可以具有可读的显式索引:
- type
- Values = enum
- valA, valB, valC
- const
- lookupTable = [
- valA: "A",
- valB: "B",
- valC: "C"
- ]
如果省略索引,则使用 succ(lastIndex) 作为索引值:
- type
- Values = enum
- valA, valB, valC, valD, valE
- const
- lookupTable = [
- valA: "A",
- "B",
- valC: "C",
- "D", "e"
- ]