news 2026/7/23 18:58:37

【Rust自学】15.3. Deref trait Pt.2:隐式解引用转化与可变性

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Rust自学】15.3. Deref trait Pt.2:隐式解引用转化与可变性

15.3 Deref trait Pt.2:隐式解引用转化与可变性

15.3.1 函数和方法的隐式解引用转化

隐式解引用转化(deref coercion)是为函数和方法提供的一种便捷特性。

它的原理是:假如类型T实现了Dereftrait,那么解引用转化可以把T的引用转换成对T应用Deref之后得到的引用。

当某个类型的引用被传给函数或方法,但其类型与声明的参数类型不匹配时,解引用转化会自动发生。编译器会对deref进行一系列调用,把它转换成所需的参数类型。这个过程在编译时完成,因此没有额外的性能开销。

这句话比较抽象,看个例子就明白了。我们接着上一篇文章的代码来写:

use std::ops::Deref; struct MyBox<T>(T); impl<T> MyBox<T> { fn new(x: T) -> MyBox<T> { MyBox(x) } } impl<T> Deref for MyBox<T> { type Target = T; fn deref(&self) -> &T { &self.0 } }

这是上一篇文章的代码。它定义了MyBox元组结构体(元组结构体的介绍详见 5.1. 定义并实例化struct),创建了new函数,并为其实现了Dereftrait,因此可以对MyBox使用普通的解引用操作。

以下是新增部分:

fn hello(name: &str) { println!("Hello, {}", name); }

hello函数接收&str,也就是字符串切片,然后把它打印出来。

再看主函数:

fn main(){ let m = MyBox::new(String::from("Rust")); hello(&m); }

mMyBox<String>类型,&m就是&MyBox<String>。然而hello期望的是&str,但这段代码并不会报错。为什么?

首先,MyBox已经实现了Dereftrait,所以 Rust 可以调用deref,把&MyBox<String>转换成&String。这就是刚才那个比较抽象的规则。

到这一步还没完。&String&str是不同的类型,那又是怎么转换的呢?因为String也实现了Dereftrait,而且它的deref实现返回的是&str类型的字符串切片,所以 Rust 会对&String使用deref,把&String转换成&str。最终类型就匹配了。

如果 Rust 没有解引用转化,写法会是这样:

hello(&(*m)[..]);
  • 先使用解引用运算符*,把mMyBox<String>转换成String
  • 再加上引用符号&,把String转换成&String
  • 通过切片语法[..],可以获得String完整内容的引用,并将其值从&String转换成&str

15.3.2 解引用与可变性

可以使用DerefMuttrait 来重载可变引用的*运算符。与Deref相比,DerefMut多了Mut,意思是DerefMut返回可变引用&mut T,而Deref返回不可变引用&T

当类型和 trait 满足下列三种情况时,Rust 会执行解引用转化:
- 当T: Deref<Target = U>时,&T可以转换成&U
T实现了Dereftrait,且Derefderef的返回类型是&U,因此&T可以转换成&U
例如,上文代码中的MyBox类型实现了Deref,其deref方法返回&T,所以&MyBox可以转换成&T

  • T: DerefMut<Target = U>时,&mut T可以转换成&mut U
    T实现了DerefMuttrait(DerefMut返回可变引用&mut T),且DerefMutderef的返回类型是&mut U,因此&mut T可以转换成&mut U

  • T: Deref<Target = U>时,&mut T可以转换成&U
    Rust 可以自动地把可变引用转换成不可变引用,但反过来绝对不行。把不可变引用转换成可变引用要求该引用是唯一的(借用规则中有讲,详见 4.4. 引用与借用)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 18:57:37

【无标题】简短的介绍

自我介绍大学生小伟目标&#xff1a;本人无太大志向只想能有一个好的工作安稳过日目前看来我只能努力学习加油

作者头像 李华
网站建设 2026/7/23 18:57:26

矩阵账号视频同质化严重,AI 怎么做出差异化内容?

一、发现问题&#xff1a;矩阵账号内容同质化导致流量衰退多数电商、MCN运营会搭建多平台、多账号矩阵体系&#xff0c;通过批量发布短视频扩大流量覆盖面。但矩阵运营过程中&#xff0c;普遍存在视频内容高度同质化的问题&#xff0c;多账号发布的视频镜头顺序、内容结构、文案…

作者头像 李华
网站建设 2026/7/23 18:56:48

可再生能源与电动汽车协同调度的Python实现与优化

1. 项目背景与核心问题可再生能源发电与电动汽车的协同调度是当前能源系统优化领域的前沿课题。随着风电、光伏等间歇性电源在电网中渗透率不断提高&#xff0c;其出力波动性给电网稳定运行带来了巨大挑战。与此同时&#xff0c;电动汽车充电负荷的时空分布特性使其具备成为柔性…

作者头像 李华
网站建设 2026/7/23 18:53:30

2026国内满意度调研机构权威排行榜 数据采集与本地化服务领跑者

本榜单评选国内头部满意度调研机构前十&#xff0c;筛选标准包括数据采集能力、本地化服务网络、样本质量与方法学严谨度&#xff0c;并附5大高精度研究方法与数据驱动决策深度解析。引言&#xff1a;评估维度与方法选择说明我们以多维指标构建权威评估框架&#xff0c;兼顾现实…

作者头像 李华
网站建设 2026/7/23 18:45:49

GEO优化为什么不能只发软文?广拓时代谈AI搜索内容资产建设

过去很多企业做线上推广&#xff0c;习惯用“发了多少篇稿”来衡量服务。 一听到服务商说一个月能发几十篇、几百篇&#xff0c;就觉得覆盖面广、声量大、效果应该不错。 但到了AI搜索时代&#xff0c;这套逻辑需要重新审视。 GEO优化不是简单比谁发得多&#xff0c;而是看哪些…

作者头像 李华