0
点赞
收藏
分享

微信扫一扫

[Rust笔记]`Deref coercion`(自动解引用类型转换)精制总结

​​Deref coercion​​(自动解引用类型转换)精制总结

  • 语法功能:
  • 实现【解引用】操作符​​*​​在自定义【智能指针】上的行为。从而,使【智能指针】如同【普通引用】一样使用。
  • 实质能力:


  • 将​​A​​类型的实例转换成​​B​​类型实例的引用,只要​​A​​与​​B​​类型之间满足​​A: Deref<Target = B>​​或​​A: DerefMut<Target = B>​​。更具体的描述,请见下表:



  • [Rust笔记]`Deref coercion`(自动解引用类型转换)精制总结_成员方法


  • 自动触发场景:


  • 先对​​A​​类型实例完成​​Deref::deref(&A)​​处理和返回​​&B​​(或​​DerefMut::deref_mut(&mut A)​​返回​​&mut B​​)

  • 再对​​B​​类型实例的引用​​&B​​执行解引用操作​​*​​,得到​​B​​实例

  • 在​​A​​类型实例上用​​.​​操作符调用​​B​​类型实例上的成员方法。

  • ​newtype​​设计模式利用这个技术点实现从外层包装类(即,智能指针)直接调用内部私有数据类型(被指向数据)的成员方法。


  • 函数调用 [例程1]


    需要注意的只有一点:函数的实参必须是【智能指针】的【引用】(而不是【智能指针】自身)才可触发​​Deref coercion​​。


  • [Rust笔记]`Deref coercion`(自动解引用类型转换)精制总结_成员方法_02

  • 成员方法调用 [例程2]

  • 解引用操作。即,*A = B [例程3],因为这实际执行了两步操作:


  • 触发次数


  • ​&B​​满足·函数签名中形参的类型要求 --- 函数调用场景

  • 在​​&B​​上·找到了·被调用的成员方法 --- 成员方法调用场景

  • ​B​​未实现​​Deref / DerefMut trait​​,不再具备继续递归的条件。

  • 若​​A​​与​​B​​都满足​​Deref / DerefMut trait​​限定条件,那么​​A -> &B​​的【解引用-类型转换】将被递归地连续执行,直至如下三个条件之一被达成,而结束递归:


  • 执行时间点

  • 编译时,而不是运行时 --- 这又是一个零成本抽象。


举报

相关推荐

0 条评论