• 可变参数

    可变参数

    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"