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 的返回值类型),用来匹配函数期望的参数类型。

相关推荐
福兮说3 分钟前
URL 编码的七个坑:c++ 传到后端变空格、%25 套娃、截断 emoji 直接报错
开发语言·前端·javascript·node.js·url
小的时候可菜了27 分钟前
JS 异步的本质:从单线程到 thenable(一条进化链)
开发语言·前端·javascript
可乐鸡翅yeah_34 分钟前
hls.js 配置 loadStartPosition,点播起始播放位置踩坑
开发语言·javascript·网络协议·ecmascript·m3u8在线
en.en..1 小时前
Linux 进程退出exit(函数)
java·开发语言·算法
Cx330❀1 小时前
【Qt 进阶指南】详解 Qt 常用标准对话框与主窗口组件架构
开发语言·qt·ui·性能优化·架构·图形渲染
Light Gao1 小时前
Encoder 与 Decoder 详解:从 Embedding 到 Seq2Seq 的完整数据流
java·开发语言·embedding
HZZD_HZZD1 小时前
弱网下CoAP还省吗?合众致达Cat.1电表90天实测:MQTT重连流量占52%、续航差距从38%拉大到73%
开发语言·物联网·php·腾讯云
web打印社区1 小时前
Windows 网页静默打印设置步骤:客户端、防火墙与联调清单
开发语言·前端·javascript·chrome·pdf·ecmascript
小师兄吃牛肉1 小时前
什么是R语言?如何快速学习R语言
开发语言·学习·r语言
Evand J1 小时前
【MATLAB例程】三维快速扩展随机树(RRT)路径规划与到达角(AOA)、到达时间差(TDOA)融合定位,附下载链接
开发语言·matlab·代码·定位·例程