Rust系列(四) trait备忘录(持续更新)

上一篇:Rust系列(三) 类型系统与trait

基于官方文档进行简单学习记录,保证所有示例是可运行的基本单元。测试rust程序除了使用官方的playground之外,还可以通过定义[[example]]来运行程序。

文章目录

  • [1. Deref](#1. Deref)
  • [2. DerefMut](#2. DerefMut)

1. Deref

用于不可变对象的解引用操作,语法类似*v
官方文档: https://doc.rust-lang.org/std/ops/trait.Deref.html
trait源码

rust 复制代码
pub trait Deref {
    type Target: ?Sized;

    // Required method
    fn deref(&self) -> &Self::Target;
}

备注: DerefDerefMut 设计之初就是为了适配和简化智能指针而设计的,应该避免为非智能指针实现相关trait,以造成混淆。
Deref coercion

假设类型T实现了Deref<Target = U> trait,有一个类型为T的变量x,有下面几条规则成立:

  • *x等价于*Deref::deref(&x)
  • 类型T必须实现所有类型U的不可变方法

应用示例

rust 复制代码
use std::ops::Deref;

struct DerefExample<T> {
    value: T,
}

impl<T> Deref for DerefExample<T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        &self.value
    }
}

fn main() {
    let x: DerefExample::<char> = DerefExample { value: 'a' };
    let target: char = *x;
    // a a
    println!("{} {}", target, 'a');
}

2. DerefMut

用于可变对象的解引用操作,语法类似*v = 1
官方文档: https://doc.rust-lang.org/std/ops/trait.DerefMut.html
trait源码

rust 复制代码
pub trait DerefMut: Deref {
    // Required method
    fn deref_mut(&mut self) -> &mut Self::Target;
}

DerefMut coercion

假设类型T实现了DerefMut<Target = U> trait,有一个类型为T的变量x,有下面几条规则成立:

  • *x等价于*DerefMut::deref_mut(&mut x)
  • 类型T必须实现所有类型U的可变和不可变方法

应用示例

rust 复制代码
use std::ops::{Deref, DerefMut};

struct DerefMutExample<T> {
    value: T,
}

impl<T> Deref for DerefMutExample<T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        &self.value
    }
}

impl<T> DerefMut for DerefMutExample<T> {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.value
    }
}

fn main() {
    let mut x: DerefMutExample::<char> = DerefMutExample { value: 'a' };
    // a a
    println!("{} {}", *x, 'a');
    *x = 'b';
    // b a
    println!("{} {}", *x, 'a');
}
相关推荐
q567315233 分钟前
Java使用Selenium反爬虫优化方案
java·开发语言·分布式·爬虫·selenium
JuiceFS16 分钟前
深度解析 JuiceFS 权限管理:Linux 多种安全机制全兼容
运维·后端
站大爷IP21 分钟前
python3如何使用QT编写基础的对话框程序
后端
老夫运道一向好28 分钟前
【YashanDB监控运维平台(YCM)】登录安全设置
后端
bing_15833 分钟前
Spring Boot 中ConditionalOnClass、ConditionalOnMissingBean 注解详解
java·spring boot·后端
凌览39 分钟前
斩获 7k Star,这个桌宠项目火了🔥
前端·javascript·后端
勤奋的知更鸟1 小时前
Java性能测试工具列举
java·开发语言·测试工具
用户0595661192091 小时前
Java 基础篇必背综合知识点总结包含新技术应用及实操指南
java·后端
小杰来搬砖1 小时前
对 JWT(JSON Web Token)令牌的完整讲解
后端