Rust:如何使用Deref, DerefMut trait?
Deref
和 DerefMut
trait有什么用?
Deref
和 DerefMut
trait 在 Rust 中允许类型重载解引用操作(即 *
运算符),否则不能实现*操作。
1. Deref
trait
Deref
trait 用于重载不可变解引用操作。
rustCopy code
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
}
}
fn main() {
let x = 5;
let y = MyBox::new(x);
assert_eq!(5, x);
assert_eq!(5, *y);
}
在上面的示例中,MyBox
结构体实现了 Deref
trait。这意味着可以使用 *
运算符来解引用 MyBox<T>
,得到它内部的值。
2. DerefMut
trait
DerefMut
trait 用于重载可变解引用操作。
rustCopy code
use std::ops::{Deref, DerefMut};
struct MutableBox<T>(T);
impl<T> Deref for MutableBox<T> {
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}
impl<T> DerefMut for MutableBox<T> {
fn deref_mut(&mut self) -> &mut T {
&mut self.0
}
}
fn main() {
let mut x = MutableBox(5);
*x += 1;
assert_eq!(*x, 6);
}
为什么要实现 Deref
和 DerefMut
?
- 智能指针: Rust 中的很多类型,如
Box<T>
,Rc<T>
, 和Ref<T>
,本质上都是智能指针。为这些类型实现Deref
和DerefMut
使得它们的使用更为直观,因为你可以直接解引用它们来访问存储的数据。 - 自动解引用:Rust 会在找到一个方法并知道它需要被引用或解引用的次数后,自动为我们添加解引用。这称为解引用强制多态(deref coercions)。例如,可以直接在
Box<String>
上调用String
的方法,而不必首先解引用Box
。 - 自定义行为:你可能有一些需要特殊解引用行为的自定义类型。通过实现这些 trait,你可以定义这些行为。- from刘金,转载请注明原文链接。感谢!
转载自:https://juejin.cn/post/7270870135228907580