news 2026/4/23 9:17:17

Rust泛型编程:从零成本抽象到极致性能

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Rust泛型编程:从零成本抽象到极致性能

1. 为什么要用泛型

  • 同一套逻辑处理不同类型数据,避免为每种类型重复写函数
  • 减少冗余代码,提升表达能力,是一种多态实现

无泛型(啰嗦版)

fnadd_i8(a:i8,b:i8)->i8{a+b}fnadd_i32(a:i32,b:i32)->i32{a+b}fnadd_f64(a:f64,b:f64)->f64{a+b}

泛型版(简洁但不能直接编译,需约束)

fnadd<T>(a:T,b:T)->T{a+b}

2. 泛型基础语法

  • T是泛型参数名(惯例用 T=Type)
    • 使用前必须先声明<T>·
fnlargest<T>(list:&[T])->T{...}

3. 关键:泛型约束(Trait Bound)

不是所有类型都支持比较、加减,必须用 Trait 限制 T 的行为。

① 比较约束(取最大值)

fnlargest<T:PartialOrd>(list:&[T])->&T{letmutlargest=&list[0];foriteminlist{ifitem>largest{largest=item;}}largest}

② 加法约束

fnadd<T:std::ops::Add<Output=T>>(a:T,b:T)->T{a+b}

4. 显式指定泛型类型

编译器无法自动推断时,用::<类型>手动指定:

usestd::fmt::Display;fncreate_and_print<T>()whereT:From<i32>+Display{leta:T=100.into();println!("a is: {}",a);}fnmain(){create_and_print::<i64>();// 显式指定 T=i64}

5. 结构体泛型

单泛型(同类型字段)

structPoint<T>{x:T,y:T,}// x、y 必须同类型letp=Point{x:1,y:2};

多泛型(不同类型字段)

structPoint<T,U>{x:T,y:U,}// x 整数,y 浮点,正常使用letp=Point{x:1,y:1.1};

6. 枚举泛型(标准库核心)

Option

enumOption<T>{Some(T),None,}

Result<T, E>(错误处理)

enumResult<T,E>{Ok(T),Err(E),}

7. 方法中的泛型

为泛型结构体实现方法

structPoint<T>{x:T,y:T}impl<T>Point<T>{// 先声明泛型 Tfnx(&self)->&T{&self.x}}

方法自带额外泛型

impl<T,U>Point<T,U>{// V、W 是方法自己的泛型fnmixup<V,W>(self,other:Point<V,W>)->Point<T,W>{Point{x:self.x,y:other.y}}}

具体类型实现方法

// 只有 f32 类型的 Point 才有此方法implPoint<f32>{fndistance_from_origin(&self)->f32{(self.x.powi(2)+self.y.powi(2)).sqrt()}}

8. Rust 特色:const 泛型(针对值的泛型)

解决不同长度数组是不同类型的问题,const N: usize代表数组长度。

// T=类型泛型,N=值泛型(数组长度)fndisplay_array<T:std::fmt::Debug,constN:usize>(arr:[T;N]){println!("{:?}",arr);}fnmain(){display_array([1,2,3]);display_array([1,2]);// 长度不同也可通用}

9. const fn(编译期执行函数)

允许在编译期计算,常用于配合 const 泛型设置数组 / 缓冲区长度。

constfnadd(a:usize,b:usize)->usize{a+b}constRESULT:usize=add(5,10);// 编译期算出结果

const fn + const 泛型

structBuffer<constN:usize>{data:[u8;N],}constfnsize(f:usize)->usize{f*1024}fnmain(){constS:usize=size(4);letbuf=Buffer::<S>{data:[0;S]};}

10. 泛型性能:零成本抽象

  • Rust 在编译期做单态化:为每种实际类型生成独立代码
  • 运行时无额外开销,效率等同于手写多份重复代码
  • 代价:编译稍慢、二进制体积稍大

示例:

letinteger=Some(5);letfloat=Some(5.0);

编译后会生成:

enumOption_i32{Some(i32),None}enumOption_f64{Some(f64),None}

全文核心要点

  1. 泛型 = 通用代码模板,减少重复
  2. 泛型必须先声明再使用
  3. 必须用 Trait 约束类型行为(比较、加法等)
  4. 支持函数、结构体、枚举、方法泛型
  5. Rust 独有:const 泛型(处理长度 / 常量)+const fn(编译期计算)
  6. 零成本抽象,运行时无性能损失
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 9:12:45

python可迭代对象,应用 在断言

文章目录前言一、any()、all()1. any()、all()2. python中的假值3.常见用法二、map()、filter()1.map()2.filter()三、生成器表达式总结前言 python中&#xff0c;涉及到批量数据的断言时。 1&#xff09;经常使用的内置函数。 提示&#xff1a;以下是本篇文章正文内容&#x…

作者头像 李华
网站建设 2026/4/23 9:09:21

xhs库:3大技术突破实现小红书数据采集的终极实战指南

xhs库&#xff1a;3大技术突破实现小红书数据采集的终极实战指南 【免费下载链接】xhs 基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/ 项目地址: https://gitcode.com/gh_mirrors/xh/xhs 在当今数据驱动的商业决策环境中&#xff0c;小红书平台蕴含…

作者头像 李华
网站建设 2026/4/23 9:04:32

CosyVoice3情感控制全解析:如何调整语音的情感强度和复合情感

CosyVoice3情感控制全解析&#xff1a;如何调整语音的情感强度和复合情感 1. 为什么需要情感语音合成&#xff1f; 在游戏开发、有声读物制作和虚拟助手交互中&#xff0c;单纯的文字转语音往往无法满足需求。一个优秀的NPC对话系统需要能够根据剧情发展调整语音情感&#xf…

作者头像 李华
网站建设 2026/4/23 8:58:34

无损视频剪辑神器:LosslessCut 完全使用指南

无损视频剪辑神器&#xff1a;LosslessCut 完全使用指南 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 想要快速剪辑视频却担心画质损失&#xff1f;LosslessCut 是你…

作者头像 李华
网站建设 2026/4/23 8:57:13

微信聊天记录解密终极指南:WechatDecrypt工具完整教程

微信聊天记录解密终极指南&#xff1a;WechatDecrypt工具完整教程 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 你是否曾经因为更换手机而丢失了重要的微信聊天记录&#xff1f;或者需要恢复那些看似无…

作者头像 李华