当前位置: 首页 > news >正文

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

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

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

文章目录

  • 1. Deref
  • 2. DerefMut

1. Deref

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

pub trait Deref {type Target: ?Sized;// Required methodfn deref(&self) -> &Self::Target;
}

备注:DerefDerefMut 设计之初就是为了适配和简化智能指针而设计的,应该避免为非智能指针实现相关trait,以造成混淆。
Deref coercion
假设类型T实现了Deref<Target = U> trait,有一个类型为T的变量x,有下面几条规则成立:

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

应用示例

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 aprintln!("{} {}", target, 'a');
}

2. DerefMut

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

pub trait DerefMut: Deref {// Required methodfn deref_mut(&mut self) -> &mut Self::Target;
}

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

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

应用示例

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 aprintln!("{} {}", *x, 'a');*x = 'b';// b aprintln!("{} {}", *x, 'a');
}
http://www.lryc.cn/news/101180.html

相关文章:

  • 贪心算法总结及其leetcode题目N道
  • k8s的namespace一直处于terminating的解法
  • JAVA面试总结-Redis篇章(六)——数据过期策略
  • 【LLM】大语言模型学习之LLAMA 2:Open Foundation and Fine-Tuned Chat Model
  • Android是如何识别USB信号的
  • 机器学习前言
  • Java另一种debug方法(not remote jmv debug),类似python远程debug方式
  • 【QT】Day4
  • 在CSDN学Golang云原生(Kubernetes Pod 有状态部署)
  • sql-从一个或多个表中向一个表中插入 多行
  • ElementUI 实现动态表单数据校验(已解决)
  • Linux上定位线上CPU飙高
  • 06-行向量列向量_向量的运算 加法,数乘,减法,转置
  • 基于Matlab实现最大类间方差阈值与遗传算法的道路分割(附上完整源码+图像+程序运行说明)
  • 13.4.2 【Linux】sudo
  • 电脑软件:键盘按键修改器——keytweak使用介绍
  • 软件工程学术顶会——ICSE 2023 议题(网络安全方向)清单与摘要
  • 【Python】jupyter Linux服务器使用
  • element 级联 父传子
  • 【MTI 6.S081 Lab】Copy-on-write
  • 【GO】go语言入门实战 —— 命令行在线词典
  • 模电模电基础知识学习笔记汇总
  • 招商银行秋招攻略和考试内容详解
  • 【Linux】四、开发工具
  • 前后端分离实现博客系统
  • 面试题-TS(六):TypeScript 中的泛型是什么?
  • QT DAY4
  • 最新Ai创作源码ChatGPT商用运营源码/支持GPT4.0+支持ai绘画+支持Mind思维导图生成
  • 一个go的支持多语言的error自动生成插件
  • wireshark抓包新手使用教程(超详细)