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

相关推荐
LDR0067 小时前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术7 小时前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园7 小时前
C++20 Modules 模块详解
java·开发语言·spring
swordbob7 小时前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享8 小时前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.8 小时前
C语言--day30
c语言·开发语言
星栈8 小时前
10 分钟跑起第一个 Dioxus 应用:`dx` CLI、`rsx!` 和热更新好不好用
前端·rust·前端框架
何以解忧,唯有..8 小时前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
謓泽8 小时前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下8 小时前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php