重载歧义消除

对于例程调用,会进行 “重载解析” 。有一种较弱的重载解析形式,称为 overload disambiguation 重载歧义消除 ,当重载符号在有额外类型信息的情况下被使用时,会执行。假设 p 是一个重载符号。则上下文是:

  • 当 q 的相应形式参数是 proc 类型时,在函数调用 q(…, p, …) 中。 如果 q 本身被重载,则必须考虑 q 和 p 的每种解释的笛卡尔积。
  • 在一个对象构造函数中 Obj(…, field: p, …) 当 field 是 proc 类型。类似的规则也适用于 array/set/tuple 的构造器。
  • 有这样的声明 x: T = p 当 T 是 proc 类型。

通常情况下,有歧义的匹配会产生编译错误。

命名参数重载

如果形参的名称不同,则可以分别调用具有相同类型签名的例程。

  1. proc foo(x: int) =
  2. echo "Using x: ", x
  3. proc foo(y: int) =
  4. echo "Using y: ", y
  5. foo(x = 2) # Using x: 2
  6. foo(y = 2) # Using y: 2

在这种情况下不提供参数名称会导致歧义错误。