当前位置: 首页 > news >正文

rust解引用

在 Rust 中,解引用(Dereferencing)是访问指针或引用所指向内存位置数据的行为。它是 Rust 所有权和内存模型中的核心操作。

1. 基础语法:* 运算符

使用 * 运算符可以从引用或指针中提取出它指向的值。
let x = 10;
let y = &x;     // y 是 x 的引用 (&i32)
let z = *y;     // 解引用:z 获得了值 10 (i32)

2. 解引用与所有权

解引用的行为取决于数据的类型:
  • Copy 类型(如 i32bool):解引用会创建一个副本,原数据不受影响。
  • 非 Copy 类型(如 StringVec):
    • 你不能通过解引用移走所有权。例如 let s2 = *s_ref; 会报错,除非该类型实现了 Copy
    • 通常只能通过解引用来修改数据(如果拥有 &mut 权限)。

3. 隐式解引用强制转换 (Deref Coercion)

这是 Rust 为了提升开发体验而设计的“魔法”。当你在某个类型上调用方法,或者将其传递给函数参数,且该类型实现了 Deref trait 时,Rust 会自动尝试进行解引用。
典型例子:String 到 &str
 
rust
fn hello(name: &str) { println!("Hello, {}!", name); }let s = String::from("Rust");
hello(&s); // 自动解引用:&String 变为 &str
Use code with caution.
编译器会自动执行 &s -> &(*s) -> &str 的转换。
 
4. 显式解引用:* 与 . 的区别
在访问结构体字段时,Rust 会自动解引用,你不需要手动写 *
 
rust
struct Point { x: i32, y: i32 }
let p = Point { x: 1, y: 2 };
let r = &p;// 自动解引用,不需要写 (*r).x
println!("{}", r.x); 
Use code with caution.
 
5. Deref 与 DerefMut 特征
你可以为自定义类型实现这两个特征,使你的类型表现得像指针(如 Box<T>Rc<T>Arc<T>)。
  • Deref: 允许通过 * 进行只读访问。
  • DerefMut: 允许通过 * 进行可变修改(需配合 &mut)。
 
rust
use std::ops::Deref;struct MyBox<T>(T);impl<T> Deref for MyBox<T> {type Target = T;fn deref(&self) -> &Self::Target { &self.0 }
}
Use code with caution.
 
6. 2025 年开发中的解引用技巧
  • 匹配人体工学(Match Ergonomics):在 match 或 if let 中,当你对一个引用进行匹配时,内部变量会自动获得引用权限,你通常不需要显式解引用或写 ref
  • 智能指针:在高性能场景(如 Suricata 插件)中,通过 Deref 机制,你可以将复杂的包装类型(如受锁保护的资源)当作内部原始数据来操作。
  • 原始指针解引用:对于 *const T 或 *mut T,解引用必须放在 unsafe 块中。
 
总结
  • *: 显式解引用,用于获取值或修改 &mut 指向的内容。
  • .: 自动解引用,用于访问属性和方法。
  • Deref Coercion: 编译器的自动服务,让不同包装层级的引用能够无缝协作。
参考资料:

1.rust语言String解引用Deref细探

2.rust智能指针Box

3.rust关键字unsafe

4.rust语言二级指针

5.rust和内部可变性模式RefCell<T>

6.指针和引用的区别(c/c++)

 

http://www.gsyq.cn/news/182009.html

相关文章:

  • systemctl 服务在哪里定义
  • Miniconda-Python3.9环境下实现PyTorch模型Serverless函数化
  • SW 随笔 005 — 星火传递 Directory.Build.props (C# 项目)
  • Miniconda配置PyTorch环境的最佳实践方法
  • 2026年中国企业接入Gemini API的首选:支持SLA保障的服务商推荐 - 智造出海
  • 如何用指纹浏览器构建安全隔离的数字身份?
  • Miniconda-Python3.9 SSH连接配置图文教程
  • Miniconda-Python3.9环境下安装TensorFlow和PyTorch的详细步骤
  • Miniconda-Python3.9如何支持PyTorch与gRPC高效通信
  • Miniconda-Python3.9如何提升GPU算力利用率
  • 苏州、上海、无锡地区海外品牌营销推广哪家好?2026年海外社媒运营推广服务商宝藏清单,涵盖Facebook、LinkedIn、TikTok、INS、Google等多平台 - 品牌2025
  • 一个python整理笔记脚本
  • Miniconda-Python3.9如何支持PyTorch与Homomorphic Encryption集成
  • 推荐几家TikTok营销服务商,五家效果不错的TikTok代运营公司、TikTok海外推广公司详细介绍 - 品牌2025
  • 2025—2026年液压机厂家推荐:闭式液压机/框架液压机/冲床液压机/315吨框架式液压机/315吨液压机/500吨液压机优质厂商深度对比! - 海棠依旧大
  • 2026软件测试工程师经典面试题
  • 2025Q4升降机厂家推荐榜:苏州卓高登顶,专精品牌成采购优选 - 品牌智鉴榜
  • Miniconda-Python3.9镜像支持Jupyter Lab的配置方法
  • PyTorch健康检查接口开发:Miniconda-Python3.9环境测试
  • PyTorch在线推理服务构建:Miniconda-Python3.9环境支撑
  • Miniconda-Python3.9安装PyYAML、NumPy等常用库指南
  • 抱歉,系统超时,请稍后重试。
  • PyTorch容错机制设计:基于Miniconda-Python3.9环境验证
  • 学长亲荐10个AI论文工具,MBA毕业论文轻松搞定!
  • 收藏!深入浅出Transformer核心架构:Encoder与Decoder实战指南
  • 护网新手集合!平民化挖掘技巧 + 实战例子,你们踩过哪些坑?评论区聊聊!
  • 赋能研发升级:IPD管理咨询的标杆案例与核心方案
  • java计算机毕业设计校园招聘管理系统 高校毕业生智慧就业撮合平台 校企协同实习与招聘一体化系统
  • 【UE】优化技巧:将造成卡顿的主线程任务,分散到多个帧进行分帧处理
  • Miniconda-Python3.9配合VS Code远程开发指南