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