面试题答案
一键面试Deref与DerefMut trait的主要作用
- Deref trait:
- 作用:主要用于重载解引用运算符
*
。当我们有一个实现了Deref
trait 的类型的实例,并且对该实例使用*
运算符时,Rust 会调用Deref::deref
方法。这使得我们可以像访问内部值一样访问结构体成员,提高代码的灵活性和一致性,例如可以让智能指针像普通指针一样使用。
- 作用:主要用于重载解引用运算符
- DerefMut trait:
- 作用:与
Deref
类似,不过是用于可变引用。它重载了可变解引用运算符*
,当对实现了DerefMut
trait 的类型的可变实例使用*
运算符时,Rust 会调用DerefMut::deref_mut
方法,允许我们对内部值进行可变操作。
- 作用:与
在自定义结构体中实现Deref trait示例
struct MyWrapper<T> {
data: T,
}
// 为MyWrapper<T>实现Deref trait
use std::ops::Deref;
impl<T> Deref for MyWrapper<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.data
}
}
fn main() {
let wrapper = MyWrapper { data: 42 };
// 可以像访问普通值一样访问wrapper内部的值
let value: &i32 = &wrapper;
assert_eq!(*value, 42);
}
在上述代码中:
- 首先定义了一个自定义结构体
MyWrapper<T>
,它包含一个泛型类型T
的成员data
。 - 然后为
MyWrapper<T>
实现了Deref
trait,指定Target
为T
,在deref
方法中返回内部data
的不可变引用。 - 在
main
函数中,创建了MyWrapper
的实例wrapper
,然后可以直接将wrapper
当作i32
的引用使用,这就是通过实现Deref
trait 实现的像访问内部值一样访问结构体成员的效果。