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 智能指针,记录解引用次数,并分别实现 Deref 和 DerefMut。