类型绑定操作符
类型绑定操作符是名称以 \= 开头的 proc 或 func ,但不是运算符(即只是包含符号而矣,如 \==)。它们与以 \= 结尾的 setter无关(参阅属性)。为类型声明的类型绑定操作符,不论是否在作用域中(包括是否私有),都将应用于该类型。
# foo.nim:
var witness* = 0
type Foo[T] = object
proc initFoo*(T: typedesc): Foo[T] = discard
proc `=destroy`[T](x: var Foo[T]) = witness.inc # type bound operator
# main.nim:
import foo
block:
var a = initFoo(int)
doAssert witness == 0
doAssert witness == 1
block:
var a = initFoo(int)
doAssert witness == 1
`=destroy`(a) # can be called explicitly, even without being in scope
doAssert witness == 2
# 在退出作用域时仍然会被调用
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 辅助类型。
想了解关于这些过程的更多细节,参阅生命期追踪钩子。
当前内容版权归 vectorworkshopbaoerjie 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 vectorworkshopbaoerjie .