MST
星途 面试题库

面试题:Rust中Deref和DerefMut trait的基础应用

请解释Rust中`std::ops::Deref`和`std::ops::DerefMut` trait的基本作用,并举例说明在什么场景下会用到`Deref`。假设你有一个自定义结构体`MyBox`,实现`Deref`将其内部值暴露,编写相关代码。
25.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

std::ops::Derefstd::ops::DerefMut trait的基本作用

  1. std::ops::Deref:这个trait允许类型重载解引用运算符*。当你对一个实现了Deref的类型使用*运算符时,Rust会调用其deref方法来返回一个内部值的引用。这在需要将一个复杂类型表现得像它所包含的类型时非常有用,例如智能指针。
  2. 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实例并对其使用*运算符,就好像它是内部值本身一样。