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

趣味学RUST基础篇(泛型)

《Rust 代码瘦身营》:告别重复,拥抱“抽象之美”!


“欢迎来到《Rust 代码瘦身营》!今天我们要帮一群‘臃肿’的代码减掉重复的脂肪,练出健美的‘泛型肌肉’!”

场景一:程序员的“复制粘贴”噩梦

想象你写了两个函数:

fn largest_i32(list: &[i32]) -> i32 {let mut largest = list[0];for &item in list {if item > largest {largest = item;}}largest
}fn largest_char(list: &[char]) -> char {let mut largest = list[0];for &item in list {if item > largest {largest = item;}}largest
}

“cool!这两个函数长得一模一样,除了一个处理 i32,一个处理 char。”

这就像你为“穿蓝衣服的人”和“穿红衣服的人”分别写了一套完全相同的操作手册——太浪费了!


解法:提取“通用逻辑”——泛型登场!

Rust 说:

“别慌!我们有泛型(Generics)——
它就像一个‘万能模板’,可以代替任何具体类型!”

我们把上面两个函数合并成一个:

fn largest<T>(list: &[T]) -> T {let mut largest = list[0];for &item in list {if item > largest {  // 这里有问题!先别急largest = item;}}largest
}

T 是什么?
它是一个“类型变量”——你可以把它想象成“某种类型,具体是谁,编译时再定”。

调用它时:

let nums = vec![1, 2, 3];
let max_num = largest(&nums);  // T 自动变成 i32let chars = vec!['a', 'b', 'c'];
let max_char = largest(&chars); // T 自动变成 char

成功瘦身!一个函数,搞定所有类型!

泛型还能用在哪儿?

不只函数,结构体、枚举也能用泛型!

1. 结构体泛型

struct Point<T, U> {x: T,y: U,
}let p1 = Point { x: 1, y: 2.5 };      // T=i32, U=f64
let p2 = Point { x: "hello", y: 'a' }; // T=&str, U=char

就像“万能收纳盒”:
你想放啥类型,它就变成啥类型!

2. 枚举泛型

还记得 Option<T>Result<T, E> 吗?

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

它们本身就是泛型的典范!
一个 Option,能装 i32StringFile……无所不能!

但泛型不是“万能胶”——它需要“行为保证”

回到 largest<T> 函数:

if item > largest { ... } // 编译错误!

问题来了:

“所有类型都能用 > 比较吗?”

比如,你能比较两个 String 吗?可以。
但你能比较两个 File 吗?不行!

所以 Rust 说:

“你得告诉我:T 必须支持‘比较’这个行为!”

这就引出了——


Trait:行为的“合同”

Trait 就像一份“能力合同”:

trait Comparable {fn compare(&self, other: &Self) -> bool;
}

但我们不用自己写,Rust 标准库有现成的:

use std::cmp::PartialOrd;fn largest<T: PartialOrd>(list: &[T]) -> T {let mut largest = list[0];for &item in list {if item > largest {  // 现在可以了!largest = item;}}largest
}

T: PartialOrd 意思是:
T 必须实现了 PartialOrd trait,也就是支持比较操作!”

就像招聘:
“我们招程序员,但必须会写代码!”(会写代码 = trait)


终极挑战:生命周期(Lifetimes)——引用的“时间管理大师”

泛型不只是类型,还有时间

看这段代码:

fn longest(x: &str, y: &str) -> &str {if x.len() > y.len() { x } else { y }
}

看起来没问题?但 Rust 会报错:

“我怎么知道返回的引用,比 xy 活得更久?”

这就像问:

“你借了两本书,哪本借得更久?但你还没说你什么时候还!”

所以 Rust 引入了 生命周期参数

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {if x.len() > y.len() { x } else { y }
}

'a 是一个“生命周期变量”:
它保证 xy 和返回值都“活”得一样久。

就像约会:
“我们仨的见面时间,不能超过最短的那个能待的时间。”

总结:三大法宝,一网打尽

工具作用类比
泛型 <T>抽象类型,避免重复代码万能模板
Trait约束泛型的行为能力合同
生命周期 'a管理引用的存活时间时间管理大师

“恭喜各位!经过今天的《Rust 代码瘦身营》,你已经掌握了:
用泛型消灭重复代码
用 Trait 确保类型有正确行为
用生命周期防止悬垂引用”


文章转载自:

http://uMengWJe.mdgpp.cn
http://myvpqK9a.mdgpp.cn
http://xevCF6gW.mdgpp.cn
http://E4Q1o2aj.mdgpp.cn
http://tuCW9wYp.mdgpp.cn
http://mDtXvYx4.mdgpp.cn
http://LErh9uvS.mdgpp.cn
http://5oJdkyDV.mdgpp.cn
http://lZHM0l91.mdgpp.cn
http://3KFpkU2X.mdgpp.cn
http://OAnlAFyU.mdgpp.cn
http://NX4wRq8Q.mdgpp.cn
http://Gs6y4T5x.mdgpp.cn
http://1LoECi0i.mdgpp.cn
http://1zBO5qe3.mdgpp.cn
http://UCmzcVSi.mdgpp.cn
http://cdbUrLNK.mdgpp.cn
http://RQ62tdEg.mdgpp.cn
http://OZDMOwFI.mdgpp.cn
http://faP8tAR9.mdgpp.cn
http://F0rtRqIf.mdgpp.cn
http://DyCdrqCN.mdgpp.cn
http://LZm1pqPy.mdgpp.cn
http://HpLAowBZ.mdgpp.cn
http://e6F5u6dW.mdgpp.cn
http://YuLSpSdZ.mdgpp.cn
http://NcaA5tSL.mdgpp.cn
http://MfzInOoM.mdgpp.cn
http://RttaqRLo.mdgpp.cn
http://rW8jNxy8.mdgpp.cn
http://www.dtcms.com/a/365008.html

相关文章:

  • OpenCL 中 内存对象完全详解和实战示例
  • 【Cursor-Gpt-5-high】StackCube-v1 任务训练结果不稳定性的分析
  • Vue3 + Ant Design Vue 实现多选下拉组件(支持分组、搜索与标签省略)
  • 【教程】IDEA中导入springboot-maven工程
  • websocket用于控制在当前页只允许一个用户进行操作,其他用户等待
  • 【教程】2025 IDEA 快速创建springboot(maven)项目
  • 通过IDEA写一个服务端和一个客户端之间的交互
  • JetBrains 2025 全家桶 11合1 Windows直装(含 IDEA PyCharm、WebStorm、DataSpell、DataGrip等)
  • Linux 对目录授予用户读写权限的方法
  • kafka:【1】概念关系梳理
  • 华清远见25072班I/O学习day4
  • Flutter代码生成:告别重复劳动,效率飙升
  • 51单片机-LED与数码管模块
  • OpenHarmony Ability“全家桶”彻底拆解:从UIAbility到ExtensionAbility一文说清楚
  • 学习嵌入式的第三十二天——网络编程——TCP
  • 【机器学习学习笔记】逻辑回归实现与应用
  • 爬取m3u8视频完整教程
  • GitHub 上那些值得收藏的英文书籍推荐(计算机 非计算机类)
  • 一键掌握服务器健康状态与安全风险
  • 前端视角下的 Web 安全攻防:XSS、CSRF、DDoS 一次看懂
  • 02、连接服务器的几种方式
  • 企业文档安全守护者全面测评:7款加密软件深度解析,让商业机密固若金汤
  • JVM分析(OOM、死锁、死循环)(JProfiler、arthas、jvm自带工具)
  • 股指期货可以通过移仓长线持有吗?
  • 基于springboot的在线答题练习系统
  • 【正则表达式】 正则表达式的元字符是什么?正则表达式的元字符有什么作用?
  • 微软rStar2-Agent:新的GRPO-RoC算法让14B模型在复杂推理时超越了前沿大模型
  • DAO LLC:怀俄明州首个承认去中心化自治组织法人化的新里程碑
  • Android Looper源码阅读
  • 手搓一个企业级Agent智能体