可变参数

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

  1. proc myWriteln(f: File, a: varargs[string]) =
  2. for s in items(a):
  3. write(f, s)
  4. write(f, "\n")
  5.  
  6. myWriteln(stdout, "abc", "def", "xyz")
  7. # 转换成:
  8. 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.  
  6. myWriteln(stdout, 123, "abc", 4.0)
  7. # 转换成:
  8. myWriteln(stdout, [$123, $"def", $4.0])

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

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

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

varargs[typed] 被特别对待:它匹配任意类型的参数的变量列表,但 始终 构造一个隐式数组。

这是必需的,以便内置的 echo proc执行预期的操作:

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