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

备注: Deref 和 DerefMut 设计之初就是为了适配和简化智能指针而设计的,应该避免为非智能指针实现相关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');
}
相关推荐
波力海苔夹心脆675几秒前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
不会算法的笨小孩22 分钟前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常
JWASX30 分钟前
【Go】map 源码解析 - group
后端·golang·map·源码分析
量化分析码农2 小时前
【Python量化波动率实战 01】波动率是怎么算的:年化、滚动与区间估计一次讲清
后端
特立独行的猫A2 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
金銀銅鐵2 小时前
从一个类名到一张类图:用反射自动生成 PlantUML
java·后端·uml
追逐时光者2 小时前
一款基于 .NET 开源、免费的数据库自治诊断平台
后端·.net
追逐时光者2 小时前
让 GitHub Copilot 更懂你的 .NET 代码风格:一份精简实用的 Copilot Instructions
后端·.net
Hhy_11073 小时前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
starzy19903 小时前
深入理解Scala函数定义:从方法到函数的类型跨越
开发语言·scala