【Rust】11. 泛型、Trait 和生命周期

news2024/11/15 10:59:03

11.1 泛型数据类型

11.1.1 函数的泛型

  • 注意:泛型的比较适用于实现了 std::cmp::PartialOrd trait 的数据类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11.1.2 结构体的泛型

  • 结构体的泛型可以使用多个泛型类型参数

在这里插入图片描述
在这里插入图片描述

11.1.3 枚举的泛型

  • 类似于结构体,枚举的泛型也可以使用多个泛型类型参数

在这里插入图片描述

11.1.4 方法的泛型

  • 定义方法时可以为泛型指定限制(只有指定类型的数据可以使用该方法
  • 结构体定义的泛型参数可以与结构体方法签名的泛型参数不同,从而可以交叉使用不同的泛型类型

在这里插入图片描述
在这里插入图片描述

11.1.5 泛型代码的性能

在这里插入图片描述

11.2 Trait:定义共同行为

11.2.1 定义 trait

  • trait 定义了不同类型的共享功能
  • trait可以只提供方法签名(后跟分号),而提供具体的实现是可选的
  • trait具体实现由每个实现该 trait 的类型来定义并提供,且每个实现都使用相同的方法签名
  • trait 体中可以有多个方法,一行一个方法签名且都以分号结尾

在这里插入图片描述
在这里插入图片描述

11.2.2 实现 trait

  • impl Xxx_trait for Yyy:为 Yyy 类型实现 Xxx_trait(使用 for
  • 实现 trait 的限制:只有当至少一个 trait 或者要实现 trait 的类型位于 crate 的本地作用域时,才能为该类型实现 trait;不能为外部类型实现外部 trait

在这里插入图片描述
在这里插入图片描述

11.2.3 trait 的默认实现

  • 默认实现是可选的
  • 默认实现允许调用相同 trait 中的其他方法,哪怕这些方法没有默认实现(也就是只需重新实现对应部分即可)

在这里插入图片描述
在这里插入图片描述

11.2.4 trait 作为参数(一):impl Trait 语法

  • impl Bound 语法用于(不)相同类型的参数

在这里插入图片描述

11.2.5 trait 作为参数(二):Trait Bound 语法

  • trait bound 语法用于相同类型的参数
  • trait_1 + trait_2 + ...:实现多个不同 trait 相加(同时实现)
  • 可通过 where 从句简化 trait bound

在这里插入图片描述
在这里插入图片描述

11.2.6 返回实现了 trait 的类型

在这里插入图片描述

11.2.7 使用 trait bound 有条件地实现方法

  • 可以有条件地只为那些实现了特定 trait 的类型来实现方法、trait
  • 举例:带【Display】trait 条件实现【xxx】方法 fnimpl<T: Display> Pair<T> { fn xxx() }
  • 举例:带【Display】trait 条件实现【ToString】traitimpl<T: Display> ToString for T

在这里插入图片描述

11.3 生命周期(一种泛型):确保引用是有效的

在这里插入图片描述

11.3.1 悬垂引用与借用检查器

  • 生命周期避免了悬垂引用

在这里插入图片描述
在这里插入图片描述

11.3.2 函数中的泛型生命周期

在这里插入图片描述
在这里插入图片描述

11.3.3 生命周期注解语法

  • 生命周期注解并不改变任何引用的生命周期的长短,而是用于描述了多个引用生命周期相互的关系
  • 生命周期注解:生命周期参数名称以撇号(')开头,其名称通常全是小写
  • &i32:引用
  • &'a i32:带有显式生命周期的引用
  • &'a mut i32:带有显式生命周期的可变引用

在这里插入图片描述

11.3.4 函数签名中的生命周期注解

  • 函数签名中的生命周期注解:在函数名和参数列表间的尖括号中声明泛型生命周期(lifetime)参数,就像泛型类型(type)参数一样
  • 当在函数中使用生命周期注解时,这些注解出现在函数签名中,而不存在于函数体中的任何代码中
  • 类似于函数 fn longest<'a>(x: &'a str, y: &'a str) -> &'a str 中,泛型生命周期 'a 的具体生命周期等同于 x 和 y 的生命周期中较小的那一个(核心概念!)

在这里插入图片描述
在这里插入图片描述

11.3.5 函数返回引用时需要关联生命周期

  • 注意:若返回引用,则需要将多个参数与其返回值的生命周期进行关联,否则最好返回有所有权的值!

在这里插入图片描述

11.3.6 结构体中的引用类型:需要生命周期注解

  • 定义包含引用类型的结构体:需要为结构体定义中的每一个引用类型添加生命周期注解

在这里插入图片描述

11.3.7 生命周期省略(Lifetime Elision)

  • 生命周期省略规则(一):编译器为每一个(输入、输出)引用参数都分配了一个生命周期参数
  • 生命周期省略规则(二):如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数
  • 生命周期省略规则(三):如果方法有多个输入生命周期参数并且其中一个参数是 &self&mut self,那么所有输出生命周期参数被赋予 self 的生命周期(该规则只适用于方法 fn 中)

在这里插入图片描述
在这里插入图片描述

11.3.8 方法(fn)中的生命周期注解

  • 实现带有生命周期的结构体实现方法 fn 时,类似于泛型类型参数的语法,比如:impl<'a> xxx_struct<'a>
  • 根据生命周期省略(三),无需在方法 fn 签名中使用生命周期注解

在这里插入图片描述

11.3.9 静态生命周期

  • 静态生命周期 'static:其生命周期能够存活于整个程序期间
  • 所有的字符串字面值都拥有 'static 生命周期
  • 使用 'static 前,思考这个引用是否真的在整个程序的生命周期里都有效

在这里插入图片描述

11.3.10 同时使用:泛型类型参数、trait bounds 和生命周期

在这里插入图片描述

11.4 小结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/190529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 动画

在App中合理地使用动画能够获得友好愉悦的用户体验&#xff0c;Android中的动画有View动画、属性动画、帧动画、布局动画、转场动画等&#xff0c;在5.x以后有又新增了矢量动画&#xff0c;这些动画在平常开发中使用较为普遍&#xff0c;所以有必要做一次完整的总结。一、View动…

130道python练习题 完整版PDF

今天跟大家分享一些干货&#xff0c;在学python的朋友可以动起来了&#xff01; python基础知识练习题&#xff0c;常见常用的&#xff0c;可以作为参考&#xff0c;挺不错的&#xff0c;也有许许多多的讲解&#xff0c;适合python巩固基础知识和入门 130道练习题&#xff0c…

电脑网速慢怎么解决?提升网速真的很容易!

我们经常会使用电脑&#xff0c;如果加载网页的时间过长&#xff0c;或者是出现未响应的提示等问题&#xff0c;会非常影响我们使用电脑的观感。 针对这种问题&#xff0c;电脑网速慢怎么解决&#xff1f;来看看下面造成电脑网速慢的主要原因&#xff0c;以及我们该怎么提升电…

Python父类方法重写

在 Python 中&#xff0c;子类继承了父类&#xff0c;那么子类就拥有了父类所有的类属性和类方法。通常情况下&#xff0c;子类会在此基础上&#xff0c;扩展一些新的类属性和类方法。但凡事都有例外&#xff0c;我们可能会遇到这样一种情况&#xff0c;即子类从父类继承得来的…

vue前框框架课程笔记(六)

目录单文件组件.vue文件单文件组件常用结构App.vueStudent.vueSchool.vuemain.jsindex.html运行结果vue脚手架具体步骤项目架构其他配置项props配置项mixin混入插件scoped属性本博客参考尚硅谷官方课程&#xff0c;详细请参考 【尚硅谷bilibili官方】 本博客以vue2作为学习目…

zookeeper源码分享四 ---- RequestProcessor 处理链路

单机zookeeper RequestProcessor 处理链路 将请求放入LinkedBlockingQueue队列中&#xff0c;通过一个队列中。启动一个线程去消费这个队列&#xff0c;避免了阻塞。 zookeeper的处理是实现RequestProcessor接口的processRequest(Request request) 方法。 PrepRequestProcesso…

exsi删除虚拟机提示在当前状况下不允许执行此操作解决方法、vmware删除虚拟机提示在当前状况下不允许执行此操作解决方法

说明 我这exsi版本为5.5 今天在回收虚拟机的时候有些虚拟机无法删除&#xff0c;提示下面内容。 解决方法 方法1 直接给删除失败的虚拟机开机&#xff0c;开机完毕以后再关机就能直接删除了。 方法2 删除失败的虚拟机&#xff0c;也无法开机的情况下&#xff0c;实用该方…

春节档的观影“热”,拯救不了影视圈的“冷”?

配图来自Canva可画 疫情三年&#xff0c;影视业也随着“冬眠”了三年。 先是疫情爆发影响影视业上下游的正常生产&#xff0c;而后国家加速规范影视行业税收秩序&#xff0c;资本相继撤离&#xff0c;再后来影视企业入不敷出业绩巨亏&#xff0c;影视寒冬来临成为行业共识。在…

MMCV - dataset_analysis.py 可视化检测和跟踪任务自定义数据集神器

做视觉检测跟踪任务时,我们需要在论文插图中体现出我们数据集的信息,这个时候就有一个非常好用的神器:dataset_analysis.py的文件。该文件能够帮助用户直接可视化custom数据集的bbox实例信息,如上图所示,包括:显示类别和 bbox 实例个数的分布图;显示类别和 bbox 实例宽/…

中科院和人社部职称评审所需材料内容对比

目录1.前言2.中科院所需材料2.1 基本情况2.2 工作经历2.3 主要专业技术工作业绩2.4 重要著&#xff08;译&#xff09;作、论文及技术工作报告2.5 继 续 教 育 情 况2.6 考试、考核情况2.7 单位推荐意见2.8 材料审核意见2.9 个人技术报告2.10 未来工作展望3.人社部所需材料3.1 …

三十八、Kubernetes1.25中数据存储第二篇

1、概述在前面已经提到&#xff0c;容器的生命周期可能很短&#xff0c;会被频繁地创建和销毁。那么容器在销毁时&#xff0c;保存在容器中的数据也会被清除。这种结果对用户来说&#xff0c;在某些情况下是不乐意看到的。为了持久化保存容器的数据&#xff0c;kubernetes引入了…

行为型模式 - 状态模式State

状态模式的定义与特点 状态&#xff08;State&#xff09;模式的定义&#xff1a;对有状态的对象&#xff0c;把复杂的“判断逻辑”提取到不同的状态对象中&#xff0c;允许状态对象在其内部状态发生改变时改变其行为。 状态模式是一种对象行为型模式&#xff0c;其主要优点…

Oracle用户权限管理

一、运行企业管理器 管理员身份运行客户端的企业管理器 首次打开需要添加数据库信息&#xff0c;这里使用已经存在的数据库orcl 使用系统用户登录 用户名&#xff1a;system&#xff0c;口令orcl 或者不输入使用SYSDBA登录 可以查看所有用户的详细信息: 用户名, 账户状态,…

union和union all 的区别

1&#xff1a;union用于合并两个或多个select 语句的结果集。 注意&#xff1a; 1&#xff1a;union内部的select 语句必需拥有相同数量的列&#xff0c;列也夜必须拥有相似的数据类型&#xff0c;同时每条select 语句中的列的顺序必须相同。 2&#xff1a;union结果集中的列…

JVM垃圾回收与性能调优策略

一、JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范&#xff0c;JVM将内存划分为&#xff1a; New&#xff08;年轻代&#xff09; Tenured&#xff08;年老代&#xff09; 永久代&#xff08;Perm&#xff09; 其中New和Tenured属于堆内存&#xff0c;堆内存会从JVM启动参…

项目代码版本控制与保护

一、版本命名规则 1.1 需求开发分支命名规则 格式&#xff1a;dev_v版本号_需求名称 案例&#xff1a;dev_v01.31_TX202301141 dev_v01.31_数字产品平台订单查询优化 1.2 测试环境发布分支命名规则 格式&#xff1a;uat_deploy 1.3 预上环境分支命名规则 格式&#xff1a…

Apsara Clouder云计算专项技能认证:云服务器ECS入门

文章目录 一、什么是云服务器ECS二、如何获取一台云服务器ECS三、5分钟学会管理云服务器ECS四、【实验】ECS云服务器新手上路五、【实验】基于ECS搭建云上博客入口: https://edu.aliyun.com/certification/cldc15 一、什么是云服务器ECS

8K超高清企业获广东省专精特新称号,背后意味着什么?

2023年开年之际&#xff0c;广州博冠光电科技股份有限公司及其子公司广州博冠智能科技有限公司通过“2022年广东省专精特新中小企业”和“2022年广东省名优高新技术产品”2项权威认定荣誉。广东省“专精特新”认定是什么&#xff1f;“专精特新”是指中小企业具备专业化、精细化…

github入门指南

文章目录什么是开源开源项目托管平台github使用介绍什么是github使用github&#xff08;1&#xff09;注册&#xff08;2&#xff09;创建远程仓库&#xff08;3&#xff09;github功能介绍本地创建仓库与远程仓库进行关联什么是开源 开源&#xff0c;即开放源代码&#xff0c…