rust学习笔记19-泛型

Rust 的泛型(Generics)允许编写可复用的代码,通过抽象类型或行为来避免重复逻辑。

1. 泛型的基本使用

函数泛型

在函数中定义泛型参数,支持不同类型的数据操作:

fn max<T: PartialOrd>(a: T, b: T) -> T {if a > b { a } else { b }
}fn main() {let largest_number = max(3, 5);println!("The largest number is {}", largest_number);let largest_string = max("apple", "banana");println!("The largest string is {}", largest_string);
}

在这个例子中,max 函数使用了泛型参数 T,并且指定了 T 必须实现 PartialOrd trait,这样才能使用大于操作符 >。

结构体泛型

结构体的字段可以使用泛型类型:

struct Point<T> {x: T,y: T,
}fn main() {let integer_point = Point { x: 5, y: 10 };let float_point = Point { x: 1.2, y: 4.5 };println!("Integer point: ({}, {})", integer_point.x, integer_point.y);println!("Float point: ({}, {})", float_point.x, float_point.y);
}
枚举泛型

Rust 标准库中的 Option<T> 和 Result<T, E> 是经典的泛型枚举:

enum Option<T> {Some(T),None,
}enum Result<T, E> {Ok(T),Err(E),
}

2.方法中的泛型

为泛型结构体实现方法:

impl<T> Point<T> {fn new(x: T, y: T) -> Self {Point { x, y }}
}// 为特定类型实现方法(如 f32)
impl Point<f32> {fn distance_from_origin(&self) -> f32 {(self.x.powi(2) + self.y.powi(2)).sqrt()}
}


3.常见应用场景
集合类型(如 Vec<T>、HashMap<K, V>)。
错误处理(Result<T, E>)。
函数式编程(闭包、迭代器适配器)。
多态 API(如 Web 框架的路由处理)。

4.注意事项
避免过度泛型化:仅在需要抽象不同类型时使用泛型。
命名规范:通常使用 T、U、K、V 等单字母命名泛型参数。
结合 Trait 使用:通过 Trait 约束明确泛型的行为(后面详讲)。

5.改写栈

struct MyStack<T> {queue: Vec<T>, }impl <T> MyStack<T> {fn new() -> Self {return MyStack {queue: Vec::new()};}fn push(&mut self, x: T) {self.queue.push(x);}fn pop(&mut self) -> T {self.queue.pop().expect("Stack is empty")}fn top(&self) -> &T {self.queue.last().expect("Stack is empty")}fn empty(&self) -> bool {return  self.queue.is_empty();}
}
fn main() {let mut num: MyStack<i32> = MyStack::new();num.push(5);num.push(6);let ret_1: i32 = num.pop();println!("{}", ret_1);let ret_2: i32 = num.pop();println!("{}", ret_2);let mut s1: MyStack<String> = MyStack::new();s1.push(String::from("rust"));s1.push(String::from("python"));let ret_3 = s1.pop();println!("{}", ret_3);let ret_4  = s1.pop();println!("{}", ret_4);}

top返回是引用&T,如果一定要返回T,需用Clone克隆

fn top(&mut self) -> T
whereT: Clone, // 添加 Clone 约束
{let n = self.pop();let cloned = n.clone();self.push(n);cloned
}

总结

泛型是编写灵活且可重用代码的强大工具。它们使得你可以编写适用于多种类型的代码,而不需要重复自己。Rust 的泛型系统不仅强大而且非常高效,因为所有泛型代码都在编译时被具体化,确保运行时性能不会受到影响。通过合理地使用泛型,你可以创建出更加通用、类型安全的程序。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯—单片机】IAP15F2K61S2专项 | 真题整理、解析与拓展 | 省赛题(更新ing...)

IAP15F2K61S2 专项 前言IAP15F2K61S2 介绍&#xff08;基于手册&#xff09;I/O口结构复位管脚RST中断第十四届省赛 外设通过PWM控制第十五届省赛题 性能与工作参数在线调试第十四届省赛题拓展与小结&#xff1a;单片机在线调试常用的接口 功耗第十五届省赛题 前言 在本文中我…

生物化学笔记:医学免疫学原理02 抗原概念+免疫应答+抗原的分类

抗原基本概念 影响抗原刺激机体产生免疫应答的因素 抗原的分类 CG 【北京大学】1080p 王月丹教授 《医学免疫学原理》2022春 全81p

(UI自动化测试)第二篇:元素定位的方法_name定位

二、name定位 ⽅法&#xff1a; driver.find_element_by_name(“name属性值”) 前置&#xff1a; 标签必须name属性 特点&#xff1a; 当前⻚⾯可以重复 提示&#xff1a; 由于name属性值可以重复&#xff0c;所以使⽤时需要查看是否为唯⼀。 # 导包selenium from selenium i…

软考中级-软件设计师 准备

软考中级-软件设计师 准备 一、软考相关1.1、考试时间1.2、考试时长1.3、题型和分值&#xff1a; 二、软考备考2.1、相关书籍2.2、推荐课程&#xff1a;B站up主zst_20012.3、学习路线 一、软考相关 1.1、考试时间 一年有两次软考&#xff0c;一般是五月末和十一月的中旬 以下…

记忆力训练day24

一 数字锁链串联法 数字两位 两位的连

田间机器人幼苗视觉检测与护苗施肥装置研究(大纲)

田间机器人幼苗视觉检测与护苗施肥装置研究 基于多光谱视觉与精准施肥的农业机器人系统设计 第一章 绪论 1.1 研究背景与意义 农业智能化需求&#xff1a; 传统幼苗检测依赖人工&#xff0c;效率低且易遗漏弱苗/病苗施肥不精准导致资源浪费和环境污染 技术挑战&#xff1a;…

Debian12生产环境配置笔记

在 Debian 12 上进行生产环境配置的详细步骤&#xff0c;涵盖软件更新、基础软件安装、Docker 及 Redis 部署&#xff0c;以及 Nginx 配置多个虚拟主机等内容。所有命令均以 root 用户身份执行&#xff0c;无需添加 sudo 1. 更新软件 首先&#xff0c;确保系统上的所有软件包…

HAL库编程知识点---Can.c和Driver_can.c分层开发

在一个工程中&#xff0c;通常会把对CAN外设的操作分成底层和上层两个部分&#xff0c;从而提高代码的模块化和可维护性。一般来说&#xff1a; can.c 通常由硬件抽象层&#xff08;HAL&#xff09;或者自动生成工具&#xff08;如 CubeMX&#xff09;提供或生成。主要负责CAN硬…

7. 【Vue实战--孢子记账--Web 版开发】-- 收支分类设置

本篇文章我们一起来实现收支分类功能。收支分类和前篇文章的主币种设置界面大体类似。我们将详细介绍如何创建和管理不同的收支分类&#xff0c;以便用户可以更好地组织和跟踪他们的财务状况。 一、功能 先来看一下原型界面&#xff0c;界面很简单&#xff0c;这里就不多讲解…

人工智能 - DeepSeek 和 Manus 的区别和应用场景

DeepSeek 与 Manus 是人工智能领域两种不同技术路线的代表,其核心区别在于功能定位和技术实现,应用场景也因此存在显著差异。以下是两者的对比分析: 一、核心区别 技术定位 DeepSeek:定位为“超级大脑”,专注于底层大模型的研发,擅长处理数学题、代码生成、知识问答等需要…

基于yolov11的防震锤缺陷检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv11的防震锤缺陷检测系统是一种利用深度学习技术进行自动化检测的系统。防震锤是电力线路中用于防止导线因风力等因素引起振动的关键部件&#xff0c;其性能状态直接影响到电力线路的安全运行。然而&#xff0c;防震锤在使用过程中可能会因各种因素导致缺…

MySQL数据库精研之旅第二期:库操作的深度探索

专栏&#xff1a;MySQL数据库成长记 个人主页&#xff1a;手握风云 目录 一、查看数据库 二、创建数据库 2.1. 语法 2.2. 示例 三、字符集编码和校验(排序)规则 3.1. 查看数据库支持的字符集编码 3.2. 查看数据库支持的排序规则 3.3. 不同的字串集与排序规则对数据库的…

ubuntu系统/run目录不能执行脚本问题解决

目录 前言 一、问题现象 二、原因分析 三、解决办法 总结 前言 在使用 Ubuntu 系统的过程中&#xff0c;我们有时会遇到在 /run 目录下无法执行脚本的情况。这篇博客将详细探讨该问题的原因&#xff0c;并提供有效的解决方案。。 一、问题现象 当尝试在 /run 目录下执行一个…

万用表测MOS好坏

测N MOS好坏 1&#xff0c;首先用万用表表笔把G D S全部短接放电。 2&#xff0c;万用表打到二极管档位 3&#xff0c;红笔接S&#xff08;源极&#xff09;&#xff0c;黑笔接D&#xff08;漏极&#xff09;&#xff0c;万用表会显示0.5V左右的电压&#xff08;内部二极管压降…

clamav服务器杀毒(Linux服务器断网状态下如何进行clamav安装、查杀)

ClamAV服务器杀毒&#xff08;服务器断网状态也可以使用该方法&#xff09; 服务器因为挖矿病毒入侵导致断网&#xff0c;进行离线的clamav安装并查杀 安装包下载网址&#xff1a;https://www.clamav.net/downloads 安装.deb&#xff0c;如果服务器处于断网状态&#xff0c;可以…

Linux:基础IO---文件描述符

文章目录 1. 前言1.1 C语言文件知识回顾 2. 文件2.1 文件基础知识 3. 被打开的文件3.1 以C语言为主&#xff0c;先回忆一下C文件接口3.2 过渡到系统&#xff0c;认识文件系统调用3.3 访问文件的本质3.4 重定向&&缓冲区 序&#xff1a;在深入了解了进程的内容后&#xf…

LINUX基础 [二] - 进程概念

目录 前言 什么是进程 如何管理进程 描述进程 组织进程 如何查看进程 通过 ps 命令查看进程 通过 ls / proc 命令查看进程 通过系统调用 获取进程标示符 前言 在学习了【Linux系统编程】中的 ​ 操作系统 和 冯诺依曼体系结构 之后&#xff0c;我们已经对系统应该有…

word使用自带的公式

文章目录 Word公式中word公式快捷键&#xff1a;word2016公式框输入多行word 公式加入空格&#xff1a;word公式如何输入矩阵:公式图片转为Latex语法word 能直接输入 latex 公式么 word文本中将文字转为上标的快捷键 Tips几个好用的网站&#xff1a; 适用于&#xff1a;我的wor…

LSM-Tree(Log-Structured Merge-Tree)详解

1. 什么是 LSM-Tree? LSM-Tree(Log-Structured Merge-Tree)是一种 针对写优化的存储结构,广泛用于 NoSQL 数据库(如 LevelDB、RocksDB、HBase、Cassandra)等系统。 它的核心思想是: 写入时只追加写(Append-Only),将数据先写入内存缓冲区(MemTable)。内存数据满后…

车载以太网网络测试-21【传输层-DOIP协议-4】

目录 1 摘要2 DoIP entity status request/response&#xff08;0x4001、0x4002&#xff09;2.1 使用场景2.2 报文结构2.2.1 0x4001&#xff1a;DoIP entity status request2.2.2 0x4002&#xff1a;DoIP entity status response 3 Diagnostic power mode information request/…