委托绑定语句

下面的示例概述了当泛型的实例化跨越多个不同模块时会出现的一个问题:

  1. # 模块 A
  2. proc genericA* [T](x: T) =
  3. mixin init
  4. init(x)
  1. import C
  2. # 模块 B
  3. proc genericB*[T](x: T) =
  4. # 实例化 `genericB` 时,如果没有 `bind init` 语句,来自模块 C 的 init 过程就是不可用的:
  5. bind init
  6. genericA(x)
  1. # 模块 C
  2. type O = object
  3. proc init* (x: var O) = discard
  1. # 主模块
  2. import B, C
  3. genericB O()

当由实例化 genericB 引发实例化 genericA 时,模块 B 的作用域中那个来自模块 C 的 init 过程未在考虑之中。 解决方案是在 genericB 中通过 bind 语句 forward “转发” 这个符号。