Deref coercion
(自动解引用类型转换)精制总结
-
Deref Coercion
是两个独立概念的“捏合体”- (自动)解引用
Auto Deref
- (隐式)类型转换
Coercion Type
因为这两个独立概念经常能够被叠加使用(比如,成员方法中的
self
参数),所以有了Deref Coercion
的“合成概念”。 - (自动)解引用
-
语法功能:
- 实现【解引用】操作符
*
在自定义【智能指针】上的行为。从而,使【智能指针】如同【普通引用】一样使用。
- 实现【解引用】操作符
-
实质能力:
-
将
A
类型的实例转换成B
类型实例的引用,只要A
与B
类型之间满足A: Deref<Target = B>
或A: DerefMut<Target = B>
。更具体的描述,请见下表:
-
-
自动触发场景:
-
成员方法调用 / 字段访问 [例程1] --- 对应于【(自动)解引用
Auto Deref
】- 在
A
类型实例上用.
操作符调用B
类型实例上的成员方法·或·访问B
类型实例上的字段值。 newtype
设计模式利用这个技术点实现从外层包装类(即,智能指针)直接调用内部私有数据类型(被指向数据)的成员方法。
- 在
-
函数调用 [例程2] --- 对应于【强制类型(转换)
Coercion Type
】需要注意的只有一点:函数的实参必须是【智能指针】的【引用】(而不是【智能指针】自身)才可触发
Deref coercion
。 -
解引用操作。即,*A = B [例程3],因为这实际执行了两步操作:
- 先对
A
类型实例完成Deref::deref(&A)
处理和返回&B
(或DerefMut::deref_mut(&mut A)
返回&mut B
) - 再对
B
类型实例的引用&B
执行解引用操作*
,得到B
实例
- 先对
-
-
触发次数
- 若
A
与B
都满足Deref / DerefMut trait
限定条件,那么A -> &B
的【解引用-类型转换】将被递归地连续执行,直至如下三个条件之一被达成,而结束递归:&B
满足·函数签名中形参的类型要求 --- 函数调用场景- 在
&B
上·找到了·被调用的成员方法 --- 成员方法调用场景 B
未实现Deref / DerefMut trait
,不再具备继续递归的条件。
- 若
-
执行时间点
- 编译时,而不是运行时 --- 这又是一个零成本抽象。
1
共 0 条评论, 1 页
评论区
写评论还没有评论