• Var形参

    Var形参

    参数的类型可以使用 var 关键字作为前缀:

    1. proc divmod(a, b: int; res, remainder: var int) =
    2. res = a div b
    3. remainder = a mod b
    4.  
    5. var
    6. x, y: int
    7.  
    8. divmod(8, 5, x, y) # modifies x and y
    9. assert x == 1
    10. assert y == 3

    在示例中, resremaindervar parameters 。 可以通过过程修改Var参数,并且调用者可以看到更改。 传递给var参数的参数必须是左值。 Var参数实现为隐藏指针。 上面的例子相当于:

    1. proc divmod(a, b: int; res, remainder: ptr int) =
    2. res[] = a div b
    3. remainder[] = a mod b
    4.  
    5. var
    6. x, y: int
    7. divmod(8, 5, addr(x), addr(y))
    8. assert x == 1
    9. assert y == 3

    在示例中,var参数或指针用于提供两个返回值。 这可以通过返回元组以更干净的方式完成:

    1. proc divmod(a, b: int): tuple[res, remainder: int] =
    2. (a div b, a mod b)
    3.  
    4. var t = divmod(8, 5)
    5.  
    6. assert t.res == 1
    7. assert t.remainder == 3

    可以使用 元组解包 来访问元组的字段:

    1. var (x, y) = divmod(8, 5) # 元组解包
    2. assert x == 1
    3. assert y == 3

    注意: var 参数对于有效的参数传递永远不是必需的。 由于无法修改非var参数,因此如果编译器认为可以加快执行速度,则编译器始终可以通过引用自由传递参数。