11 Rust中的泛型

  • 拾一维
  • 更新于 2023-03-15 08:10
  • 阅读 1246

在前10章中,我们主要是就Rust中的数据类型以及一些常识问题(如路径、prelude等)做了介绍,比较细枝末节。从本节开始我们将会从更宏观的视角介绍Rust中的知识点

在前10章中,我们主要是就Rust中的数据类型以及一些常识问题(如路径、prelude等)做了介绍,比较细枝末节。从本节开始我们将会从更宏观的视角介绍Rust中的知识点。但细节也会涉及。今天我们来看看期待已久的泛型

先来让我们思考一下编程语言为什么需要泛型?泛型主要具有以下益处

1 提高代码的灵活性和重用性

我们来看一个例子:定义一个泛型数据库引擎,在具体需要哪种数据库的时候再选择某种数据库,而所有针对数据库的操作都可以基于DBEngine来实现。泛型参数一般用大写字母来表示,如 T,另外生命周期参数也是泛型参数,一般用小写字母表示(见下一个例子)

11.1.png

2 约束类型

在很多情况下,我们经常会将泛型和Trait结合起来使用,以达到类型约束的目的,继续看下面的例子

11.2.png

在上面的例子中,我们只允许哪些实现了特定trait(这里是Operation)的数据类型执行代码逻辑,这极大的限制了类型的行为,同时这种严格的定义方式也可以让开发人员非常清楚自己的代码干了什么,而不是模棱两可,从而避免了后续很多安全问题。这也是Rust程序一旦编译通过,相对来说更安全的原因之一

3 优化性能

在Rust中,泛型是零成本的,因为会在编译期就单态化(在实际调用的位置生成具体类型相关的的代码)。所以程序的运行效率会比较高

11.3.png

但是单态化的坏处是编译速度很慢,如对于泛型函数来说,编译器需要找到所有用到的不同类型,一个个编译,所以 Rust 编译代码的速度总被人吐槽,另一个拖慢编译速度的重要因素是宏

另外:单态化后,代码以二进制分发会损失泛型的信息

示例代码Github地址:

https://github.com/shiyivei/from-principle-to-practice/blob/main/src/principle-and-practice/src/type_system/generic.rs

另外,可以选择clone本仓库代码,使用cargo doc --open阅读,体验更佳

git clone git@github.com:shiyivei/from-principle-to-practice.git
cd from-principle-to-practice
cargo doc --open

更多内容欢迎关注公众号拾一维

  • 原创
  • 学分: 1
  • 分类: Move
  • 标签:
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。
该文章收录于 Rust进阶知识
32 订阅 11 篇文章

0 条评论

请先 登录 后评论
拾一维
拾一维
For science, art and meaning