likes
comments
collection
share

Rust:如何使用Deref, DerefMut trait?

作者站长头像
站长
· 阅读数 78

DerefDerefMut trait有什么用?

DerefDerefMut 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);
}

为什么要实现 DerefDerefMut

  • 智能指针: Rust 中的很多类型,如 Box<T>, Rc<T>, 和 Ref<T>,本质上都是智能指针。为这些类型实现 DerefDerefMut 使得它们的使用更为直观,因为你可以直接解引用它们来访问存储的数据。
  • 自动解引用:Rust 会在找到一个方法并知道它需要被引用或解引用的次数后,自动为我们添加解引用。这称为解引用强制多态(deref coercions)。例如,可以直接在 Box<String> 上调用 String 的方法,而不必首先解引用 Box
  • 自定义行为:你可能有一些需要特殊解引用行为的自定义类型。通过实现这些 trait,你可以定义这些行为。- from刘金,转载请注明原文链接。感谢!
转载自:https://juejin.cn/post/7270870135228907580
评论
请登录