Var形参
参数的类型可以使用 var 关键字作为前缀:
- proc divmod(a, b: int; res, remainder: var int) =
- res = a div b
- remainder = a mod b
- var
- x, y: int
- divmod(8, 5, x, y) # modifies x and y
- assert x == 1
- assert y == 3
在示例中, res 和 remainder 是 var parameters 。 可以通过过程修改Var参数,并且调用者可以看到更改。 传递给var参数的参数必须是左值。 Var参数实现为隐藏指针。 上面的例子相当于:
- proc divmod(a, b: int; res, remainder: ptr int) =
- res[] = a div b
- remainder[] = a mod b
- var
- x, y: int
- divmod(8, 5, addr(x), addr(y))
- assert x == 1
- assert y == 3
在示例中,var参数或指针用于提供两个返回值。 这可以通过返回元组以更干净的方式完成:
- proc divmod(a, b: int): tuple[res, remainder: int] =
- (a div b, a mod b)
- var t = divmod(8, 5)
- assert t.res == 1
- assert t.remainder == 3
可以使用 元组解包 来访问元组的字段:
- var (x, y) = divmod(8, 5) # 元组解包
- assert x == 1
- assert y == 3
注意: var 参数对于有效的参数传递永远不是必需的。 由于无法修改非var参数,因此如果编译器认为可以加快执行速度,则编译器始终可以通过引用自由传递参数。