面试题答案
一键面试std::ops::Deref
和std::ops::DerefMut
trait的基本作用
std::ops::Deref
:这个trait允许类型重载解引用运算符*
。当你对一个实现了Deref
的类型使用*
运算符时,Rust会调用其deref
方法来返回一个内部值的引用。这在需要将一个复杂类型表现得像它所包含的类型时非常有用,例如智能指针。std::ops::DerefMut
:它是Deref
的可变版本,允许类型重载可变解引用运算符*
。当对一个实现了DerefMut
的类型使用可变解引用*
时,Rust会调用deref_mut
方法,返回一个内部值的可变引用,用于修改内部值。
Deref
的使用场景
通常在实现智能指针时会用到Deref
,比如Box<T>
、Rc<T>
、Arc<T>
等。以Box<T>
为例,当你有一个Box<i32>
,你可以直接对它使用*
来获取内部的i32
值,就好像它本身就是i32
一样,这背后就是Box
实现了Deref
trait。
自定义结构体MyBox
实现Deref
的代码
use std::ops::Deref;
struct MyBox<T>(T);
impl<T> Deref for MyBox<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.0
}
}
fn main() {
let x = MyBox(5);
assert_eq!(5, *x);
}
在上述代码中,MyBox
结构体有一个泛型成员,实现了Deref
trait。deref
方法返回内部值的引用。在main
函数中,我们创建了一个MyBox
实例并对其使用*
运算符,就好像它是内部值本身一样。