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');
}
相关推荐
engchina10 分钟前
Python 数据持久化
开发语言·python
久久不觉12 分钟前
嵌入式开发 的软件开发工具
开发语言·后端·golang
虽千万人 吾往矣20 分钟前
golang 熔断限流降级
开发语言·后端·golang
chengxuyuan1213_30 分钟前
python常用基础语法
开发语言·windows·python
weixin_4383354031 分钟前
springboot 中添加TCP连接服务端
spring boot·后端·tcp/ip
程序猿毕设源码分享网1 小时前
基于springboot校园招聘系统源码和论文
java·spring boot·后端
山山而川粤1 小时前
美食推荐系统|Java|SSM|JSP|
java·开发语言·后端·学习·mysql
小小药1 小时前
012-spring的注解开发
java·后端·spring
#sakura1 小时前
javaEE
java·开发语言·java-ee
arong_xu1 小时前
Modern C++ std::atomic简介
开发语言·c++·atomic