类型绑定操作符

类型绑定操作符是名称以 \= 开头的 proc 或 func ,但不是运算符(即只是包含符号而矣,如 \==)。它们与以 \= 结尾的 setter无关(参阅属性)。为类型声明的类型绑定操作符,不论是否在作用域中(包括是否私有),都将应用于该类型。

  1. # foo.nim:
  2. var witness* = 0
  3. type Foo[T] = object
  4. proc initFoo*(T: typedesc): Foo[T] = discard
  5. proc `=destroy`[T](x: var Foo[T]) = witness.inc # type bound operator
  6. # main.nim:
  7. import foo
  8. block:
  9. var a = initFoo(int)
  10. doAssert witness == 0
  11. doAssert witness == 1
  12. block:
  13. var a = initFoo(int)
  14. doAssert witness == 1
  15. `=destroy`(a) # can be called explicitly, even without being in scope
  16. doAssert witness == 2
  17. # 在退出作用域时仍然会被调用
  18. doAssert witness == 3

类型限定运算符有: \=destroy, \=copy, \=sink, \=trace, \=deepcopy, \=wasMoved, \=dup.

这些操作被 overridden “重写”, 而不是 overloaded “重载”。这意味着实现会自动提升为结构化类型。 例如,如果类型 T 有一个重写的赋值运算符 \= ,这个操作符也可用于类型 seq[T] 的赋值。

由于这些操作被绑定到一个类型,为了实现的简单性,它们必须绑定到一个名义上的类型; 这意味着一个被重写的 deepCopy 的 ref T 是真正绑定到 T 而不是 ref T 。 这也意味着,不能同时重写 deepCopy 的 ptr T 和 ref T ,相反,必须为一种指针类型使用 distinct 或 object 辅助类型。

想了解关于这些过程的更多细节,参阅生命期追踪钩子