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参数,因此如果编译器认为可以加快执行速度,则编译器始终可以通过引用自由传递参数。