数组和序列类型

数组是同类型的,即数组中的每个元素都类型相同。数组总是具有指定为常量表达式的固定长度(开放数组除外)。它们可以按任意序数类型索引。 若参数 A 是 开放数组 ,那么它的索引为由 0 到 len(A)- 1 的整数。数组表达式可以由数组构造器 [] 构造。 数组表达式的元素类型是从第一个元素的类型推断出来的。所有其他元素都需要隐式转换为此类型。

可以使用 array[size, T] 构造数组类型,也可以使用 array[lo..hi, T] 设置数组的起点,而不是默认的 0。

序列类似于数组,但有动态长度,其长度可能在运行时期间发生变化(如字符串)。序列为可增长的数组实现,在添加项目时分配内存块。 序列 S 的索引为从 0 到 len(S)-1 的整数,并检查其边界。序列可以在序列运算符 @ 的帮助下,结合数组构造器 [] 一起构造。 为序列分配空间的另一种方法是调用内置的 newSeq 过程。

序列可以传递给 开放数组 类型的参数。

例如:

  1. type
  2. IntArray = array[0..5, int] # 索引为0到5的数组
  3. IntSeq = seq[int] # 一个整数序列
  4. var
  5. x: IntArray
  6. y: IntSeq
  7. x = [1, 2, 3, 4, 5, 6] # [] 是数组构造器
  8. y = @[1, 2, 3, 4, 5, 6] # @ 会将数组转换成序列
  9. let z = [1.0, 2, 3, 4] # z 的类型是 array[0..3, float]

数组或序列的下限可以用内置的过程 low() 获取,上限用 high() 获取。长度可以用 len() 获取。 序列或开放数组的 low() 总是返回 0,因为这是第一个有效索引。 可以使用 add() 过程或 & 运算符将元素追加到序列中,并使用 pop() 过程删除(并获取)序列的最后一个元素。

符号 x[i] 可用于访问 x 的第 i 个元素。

数组始终进行边界检查(静态或运行时)。可以通过编译指示禁用这些检查,或调用编译器时,使用 --boundChecks:off 命令行开关。

数组构造器可以具有可读的显式索引:

  1. type
  2. Values = enum
  3. valA, valB, valC
  4. const
  5. lookupTable = [
  6. valA: "A",
  7. valB: "B",
  8. valC: "C"
  9. ]

如果省略索引,则使用 succ(lastIndex) 作为索引值:

  1. type
  2. Values = enum
  3. valA, valB, valC, valD, valE
  4. const
  5. lookupTable = [
  6. valA: "A",
  7. "B",
  8. valC: "C",
  9. "D", "e"
  10. ]