数组和序列类型
数组是同类型的,即数组中的每个元素都类型相同。数组总是具有指定为常量表达式的固定长度(开放数组除外)。它们可以按任意序数类型索引。 若参数 A 是 开放数组 ,那么它的索引为由 0 到 len(A)- 1 的整数。数组表达式可以由数组构造器 [] 构造。 数组表达式的元素类型是从第一个元素的类型推断出来的。所有其他元素都需要隐式转换为此类型。
可以使用 array[size, T] 构造数组类型,也可以使用 array[lo..hi, T] 设置数组的起点,而不是默认的 0。
序列类似于数组,但有动态长度,其长度可能在运行时期间发生变化(如字符串)。序列为可增长的数组实现,在添加项目时分配内存块。 序列 S 的索引为从 0 到 len(S)-1 的整数,并检查其边界。序列可以在序列运算符 @ 的帮助下,结合数组构造器 [] 一起构造。 为序列分配空间的另一种方法是调用内置的 newSeq 过程。
序列可以传递给 开放数组 类型的参数。
例如:
type
IntArray = array[0..5, int] # 索引为0到5的数组
IntSeq = seq[int] # 一个整数序列
var
x: IntArray
y: IntSeq
x = [1, 2, 3, 4, 5, 6] # [] 是数组构造器
y = @[1, 2, 3, 4, 5, 6] # @ 会将数组转换成序列
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 命令行开关。
数组构造器可以具有可读的显式索引:
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"
]