Rust 中的“解引用”和智能指针与 MutexGuard 等

参考:使用 Deref trait 将智能指针当作常规引用处理 - Rust 程序设计语言 中文版

参考:Treating Smart Pointers Like Regular References - The Rust Programming Language

Rust 标准库提供 Deref trait 用于重载 * 运算符

对于普通的引用类型如 p: &T,*p 意味着获取一个临时的 T。比如字段访问操作 p.a 会被编译器自动解引用,得到 (*p).a = t.a。

对于智能指针 p: Box<T>,由于 Box 类型实现了 Deref trait,所以可以执行 *p,而且 *p 的意思是:*(p.deref()),这里 p.deref() 得到 &T,而 *(p.deref()) 开头的 * 就是对普通引用 &T 的解引用操作了。

所以也可以说,Deref trait 使得我们可以从智能指针中获得普通引用,再对普通引用执行解引用。

有了 Deref trait,我们可以像使用普通引用那样使用智能指针和 MutexGuard 等。

而由于编译器有自动解引用(自动添加 *)的功能,所以我们可以像使用普通类型 T 那样使用 T 的普通引用类型(&T)。

综合以上两步,我们可以像使用普通类型 T 那样使用包裹 T 的智能指针和 MutexGuard。

最后简单聊聊解引用强制转换deref coercions

最好直接去看参考。解引用强制转换是指在使用 &T 作为函数参数且 T 实现了 Deref trait 时,编译器可以通过调用 T::deref,将原本的参数 &T 转换成 &Target(&Target 为 deref 的返回值类型),用来匹配函数期望的参数类型。

相关推荐
神仙别闹2 分钟前
基于C++ MFC实现动态分区分配存储管理
开发语言·c++·mfc
for_ever_love__8 分钟前
python基础语法学习: 类型注解
开发语言·python·学习
caimouse13 分钟前
ReactOS 图形系统分析(46):DC 工具 — dcutil.c
c语言·开发语言
xixiaoyunya27 分钟前
从零搭建跨域互联网络:个人与小团队的轻量组网方案技术解析
开发语言·智能路由器·php
资源大佬星 课it32 分钟前
黑马 Java+AI新版V16零基础就业班视频课程百度网盘下载
java·开发语言·人工智能
雾沉川32 分钟前
Rust IDE 选型:除 VS Code 之外,RustRover 非商业场景可免费使用
ide·vscode·rust
zmzb010333 分钟前
Python课后习题训练记录Day193
开发语言·python
郝学胜-神的一滴38 分钟前
[简化版 GAMES 104] 现代游戏引擎 06:从Tick时序到邮局模型,拆解确定性世界的底层密码
开发语言·c++·游戏引擎·图形渲染·软件开发·opengl
二十雨辰38 分钟前
[Java]-微服务面试题
java·开发语言·微服务
不会代码的小猴39 分钟前
6. Qt网络编程
开发语言·c++·笔记·qt·算法