数组和序列类型

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

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

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

示例:

  1. type
  2. IntArray = array[0..5, int] # an array that is indexed with 0..5
  3. IntSeq = seq[int] # a sequence of integers
  4. var
  5. x: IntArray
  6. y: IntSeq
  7. x = [1, 2, 3, 4, 5, 6] # [] is the array constructor
  8. y = @[1, 2, 3, 4, 5, 6] # the @ turns the array into a sequence
  9.  
  10. 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 命令行开关调用编译器。

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

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

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

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