泛型中的符号查找

开放和封闭符号

泛型中的符号绑定规则略显微妙: 存在开放和封闭两种符号。 封闭的符号在实例化的上下文中无法被重新绑定,而开放的符号则可以。 默认情况下,重载符号都是开放的,所有其他符号都是封闭的。

会在两种不同的上下文中查找开放的符号: 一是其定义所处的上下文,二是实例化时的上下文:

  1. type
  2. Index = distinct int
  3. proc `==` (a, b: Index): bool {.borrow.}
  4. var a = (0, 0.Index)
  5. var b = (0, 0.Index)
  6. echo a == b # 可以!

在这个例子中,针对元组的泛型 \== (定义于 system 模块) 建立在元组各字段的 \== 运算之上。 然而,针对 Index 类型的 \== 定义发生泛型 \== 定义 之后; 这个例子可以编译,因为实例化关于元组的 \== 时,当前定义的关于 Index 的 \== 也会考虑进来。