Rust : 关于Deref

一、原码

Deref Trait的原码如下:

css 复制代码
pub trait Deref: PointeeSized {
    type Target: ?Sized;
    fn deref(&self) -> &Self::Target;
}

impl<T: ?Sized> const Deref for &T {
    type Target = T;
    fn deref(&self) -> &T {
        *self
    }
}

二、关键词

隐式、自动解引用。

Deref Trait 是Rust的特色。它隐藏的很深,有时侯会感觉到很上头。

自动解引用,就是化繁为简的操作。

只有深刻理解这两者,才能真正理解Deref Trait的初衷。

三、常见的取引用和解引用操作

当 T实现了Deref Trait:

css 复制代码
*T = *(T.deref()) = <T as Deref>::Target

正常解引用;其中,T.deref() -> &< T as Deref >::Target。

css 复制代码
&*T  = &(*T):

先解引用得到< T as Deref>::Target,再取地址

css 复制代码
&**T = &(*(*T))

先进行第1次解引用,得到< T as Deref>::Target,再对< T as Deref>::Target进行解引用,得到<< T as Deref>::Target as Deref>::Target。再取地址。

css 复制代码
 *&T  = T

先取引用,后解引用。需要注意:这种操作可能报错,已经被move了。

css 复制代码
*&&T = &T; 

先两次取引用,后做一次解引用。

css 复制代码
&*T = T.deref();

四、点操作

以 T.method() 为例,其中点操作内含的自动解引用顺序如下:

step 1:

css 复制代码
T.method() 

如果T没有实现method(),则进行step 2

step 2:

css 复制代码
 (&*T).method()  = T.deref().method()

第2次解引用,如果没有成功,则进行step 3

step 3:

css 复制代码
(&**T).method() = T.deref().deref().method()

第3次解引用,如果没有成功,则进行step 3...

...

五、类型转换:&T ->&U

css 复制代码
T: Deref<Target=U> => &T =>&U

常见场景:函数的参数操作,如:

css 复制代码
 fn(&T)(){} ->fn(&U)(){} 
相关推荐
达达尼昂7 分钟前
编码智能体中的模型选择与执行深度
人工智能·后端·程序员
用户6757049885029 分钟前
写了 6 年 Go ,我终于领悟到了泛型的真正威力!
后端·go
名字还没想好☜26 分钟前
Go error 处理:errors.Is/As 与错误包装
开发语言·后端·golang·go·错误处理
红糖奶茶26 分钟前
Python 中 while 循环计数异常的常见原因分析与正确搓搓
开发语言·python
Lucky_Turtle32 分钟前
【论文写作】PDF图片不清晰,打印生成PDF空白大,PDF字体嵌入
开发语言·pdf·c#
csdndenglu39 分钟前
Easy3D:一个轻量级、易用、高效的C++库,用于处理和渲染3D数据,无复杂要求时可替代VTK
开发语言·c++·图形渲染·3d渲染
doiito40 分钟前
【安全,架构】RustyVault 项目深度分析报告以及和HashiCorp Vault的差异
后端·安全·rust
尚早立志1 小时前
Spring Boot 之 BeanDefinitionLoader 详解
java·spring boot·后端
byte轻骑兵1 小时前
【AVRCP】规范精讲[41]:AV/C指令帧解析,蓝牙遥控交互的底层语言
c语言·开发语言·人机交互·智能制造·avrcp
发光小北1 小时前
Bronze100系列plc Modbus及自由口通信案例
开发语言·php