⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

Rust Deref 特征详解

理解 Deref 和 DerefMut trait 如何实现智能指针的解引用操作 · 难度:入门 · +15XP

Deref 特征的作用

Deref trait 允许你重载解引用运算符 *。当类型实现了 Deref,Rust 编译器会自动调用 deref() 方法将类型转换为目标引用,从而实现智能指针像普通引用一样使用。

基本语法

use std::ops::Deref;

struct MyBox<T>(T);

impl<T> Deref for MyBox<T> { type Target = T; fn deref(&self) -> &T { &self.0 } }

fn main() { let x = MyBox(5); assert_eq!(5, *x); // 等价于 *(x.deref()) }

隐式解引用转换

Rust 会在函数参数、方法调用等场景自动应用解引用转换,让代码更简洁:

场景示例
函数参数fn hello(name: &str) 可传入 &String
方法调用boxed_val.len() 自动解引用到 String
use std::ops::Deref;

struct MyString(String);

impl Deref for MyString { type Target = String; fn deref(&self) -> &String { &self.0 } }

fn print(s: &str) { println!("{}", s); }

let s = MyString("Hello".to_string()); print(&s); // 自动转换 &MyString -> &String -> &str

DerefMut —— 可变解引用

需要修改数据时,需实现 DerefMut trait:

use std::ops::{Deref, DerefMut};

impl<T> DerefMut for MyBox<T> { fn deref_mut(&mut self) -> &mut T { &mut self.0 } }

练习提示: 自定义一个 CountedBox 智能指针,记录解引用次数,并分别实现 DerefDerefMut

Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 122 篇
0 完成
🔥 0