Var 参数

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

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

在示例中, res 和 remainder 是 var 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. var
  5. x, y: int
  6. divmod(8, 5, addr(x), addr(y))
  7. assert x == 1
  8. assert y == 3

在示例中,var 形参或指针用来提供两个返回值。这可以通过返回一个元组这种更简洁的方式来完成:

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

可以使用 tuple unpacking 来访问元组的字段:

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

注意: 对于高效的参数传递来说, var 形参不是必需的。 因为非 var 形参不能修改,所以编译器在认为可以加快执行速度的情况下,会更自由地通过引用传递参数。