MST

星途 面试题库

面试题:Rust中Deref与DerefMut trait的基本应用

请简述Rust中Deref与DerefMut trait的主要作用,并举例说明如何在自定义结构体中实现Deref trait,以便像访问内部值一样访问结构体成员。
35.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Deref与DerefMut trait的主要作用

  1. Deref trait
    • 作用:主要用于重载解引用运算符 *。当我们有一个实现了 Deref trait 的类型的实例,并且对该实例使用 * 运算符时,Rust 会调用 Deref::deref 方法。这使得我们可以像访问内部值一样访问结构体成员,提高代码的灵活性和一致性,例如可以让智能指针像普通指针一样使用。
  2. 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);
}

在上述代码中:

  1. 首先定义了一个自定义结构体 MyWrapper<T>,它包含一个泛型类型 T 的成员 data
  2. 然后为 MyWrapper<T> 实现了 Deref trait,指定 TargetT,在 deref 方法中返回内部 data 的不可变引用。
  3. main 函数中,创建了 MyWrapper 的实例 wrapper,然后可以直接将 wrapper 当作 i32 的引用使用,这就是通过实现 Deref trait 实现的像访问内部值一样访问结构体成员的效果。