可变参数
varargs 参数是一个开放数组参数,它还允许将可变数量的参数传递给过程。 编译器隐式地将参数列表转换为数组:
- proc myWriteln(f: File, a: varargs[string]) =
- for s in items(a):
- write(f, s)
- write(f, "\n")
- myWriteln(stdout, "abc", "def", "xyz")
- # 转换成:
- myWriteln(stdout, ["abc", "def", "xyz"])
仅当varargs参数是过程头中的最后一个参数时,才会执行此转换。 也可以在此上下文中执行类型转换:
- proc myWriteln(f: File, a: varargs[string, `$`]) =
- for s in items(a):
- write(f, s)
- write(f, "\n")
- myWriteln(stdout, 123, "abc", 4.0)
- # 转换成:
- myWriteln(stdout, [$123, $"def", $4.0])
在这个例子中, $ 应用于传递给参数 a 的任何参数。 (注意 $ 对字符串是一个空操作。)
请注意,传递给 varargs 形参的显式数组构造函数不会隐式地构造另一个隐式数组:
- proc takeV[T](a: varargs[T]) = discard
- takeV([123, 2, 1]) # takeV的T是"int", 不是"int数组"
varargs[typed] 被特别对待:它匹配任意类型的参数的变量列表,但 始终 构造一个隐式数组。
这是必需的,以便内置的 echo proc执行预期的操作:
- proc echo*(x: varargs[typed, `$`]) {...}
- echo @[1, 2, 3]
- # 打印 "@[1, 2, 3]" 而不是 "123"