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

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. 零成本抽象,运行时无性能损失
http://www.jsqmd.com/news/686492/

相关文章:

  • 探讨诚信的货运代理企业费用,福建领航收费贵不贵? - mypinpai
  • 立体匹配算法评测避坑指南:手把手教你用Middlebury Stereo Evaluation v.3网站
  • 终极指南:如何用Office Custom UI Editor打造你的专属Office界面
  • 2026年雅思写作学习App推荐:智能批改助力高分突破 - 品牌2025
  • Windows Cleaner:三步彻底解决C盘爆红的终极免费方案
  • 如何用ColorControl一键切换NVIDIA显示配置:从游戏到影音的完美体验
  • 2026年江苏机器人公司推荐,江苏金舟机器人口碑传播好的原因分析 - 工业品网
  • 基于微信小程序的旅游服务助手 景点 酒店 旅游规划 可视化
  • Gemma-4-26B-A4B-it-GGUF部署教程:/root/ai-models路径规范管理+多模型共存方案
  • 2026年雅思口语练习app推荐:智能评分与实战模拟,助你稳拿高分 - 品牌2025
  • 终极Windows安装媒体创建工具:一键支持1507到23H2全版本
  • 在做直播时,I帧的间隔(GOP)一般是多少?
  • 2026年江苏焊接机器人公司哪家性价比高,分析江苏金舟机器人的应对策略 - 工业品牌热点
  • PPH水槽哪个厂家可定制?同时要求性能好、质量稳、口碑优、价格合理 - 品牌推荐大师
  • Memcached内核源码深度解析
  • 零代码定制Office功能区:3小时从新手到专家的完整指南
  • [具身智能-417]:URDF中的inertial标签详解和示例说明
  • 轻量化个人助手:Qwen-7B模型在边缘设备的实践
  • 如何通过手机号快速查询QQ号:Python工具的终极指南
  • 2026年成都靠谱的地板定制公司排名,抗菌地板供应商费用多少 - 工业推荐榜
  • 2026年好用的蓝牙信号屏蔽器盘点,航天润普性价比高 - mypinpai
  • WarcraftHelper终极指南:让魔兽争霸3在现代系统上流畅运行的完整方案
  • AI 应用开发的脚手架搭建之旅
  • 机器学习中的多项式与幂函数求导基础
  • 空间智能的范式转移:GeoAI 如何重塑 GIS 工作流
  • 告别AI失忆:深度解析Chatbox上下文配置的优化策略
  • 地板品牌厂家推荐,四川地区靠谱且价格实惠的有哪些 - myqiye
  • 大型手机信号屏蔽器公司哪家口碑好? - 工业品网
  • 数谷智能1+N架构AI Agent,专为企业解决数智化转型难题
  • OpenMetadata:统一元数据平台,助力挖掘数据资产价值!