可变参数

varargs 参数是一个开放数组参数,它允许将可变数量的参数传递给过程。编译器隐式地将参数列表转换为数组:

  1. proc myWriteln(f: File, a: varargs[string]) =
  2. for s in items(a):
  3. write(f, s)
  4. write(f, "\n")
  5. myWriteln(stdout, "abc", "def", "xyz")
  6. # 转换成:
  7. myWriteln(stdout, ["abc", "def", "xyz"])

仅当 varargs 参数是最后一个参数时,才会执行此转换。在这种情况下也可以执行类型转换::

  1. proc myWriteln(f: File, a: varargs[string, `$`]) =
  2. for s in items(a):
  3. write(f, s)
  4. write(f, "\n")
  5. myWriteln(stdout, 123, "abc", 4.0)
  6. # 转换成:
  7. myWriteln(stdout, [$123, $"abc", $4.0])

在这个例子中, $ 应用于传递给参数 a 的任意参数。 (注意 $ 对字符串是一个空操作。)

请注意,传递给 varargs 形参的显式数组构造器不会隐式地构造另一个隐式数组:

  1. proc takeV[T](a: varargs[T]) = discard
  2. takeV([123, 2, 1]) # takeV 的 T 是 "int" , 不是 "int 数组"

varargs[typed] 被特别对待: 它匹配任意类型参数的变量列表,但 始终 构造一个隐式数组。这是必需的,只有这样,内置的 echo 过程才能够执行预期的操作:

  1. proc echo* (x: varargs[typed, `$`]) {...}
  2. echo @[1, 2, 3]
  3. # 输出 "@[1, 2, 3]" 而不是 "123"