第 12 章 运算符重载
吉姆•布兰迪
在第 2 章展示的曼德博集绘图器中,我们使用了 num crate 的 Complex 类型来表示复平面上的数值:
使用 Rust 的 + 运算符和 * 运算符,可以像对任何内置数值类型一样对 Complex 进行加法运算和乘法运算:
你也可以让自己的类型支持算术运算符和其他运算符,只要实现一些内置特型即可。这叫作运算符重载,其效果跟 C++、C#、Python 和 Ruby 中的运算符重载很相似。
运算符重载的特型可以根据其支持的语言特性分为几类,如表 12-1 所示。本章将逐一介绍每个类别。我们不仅要帮你把自己的类型很好地集成到语言中,而且要让你更好地了解如何编写泛型函数,比如 11.1.2 节讲过的 dot_product 函数,该函数能使用运算符自然而然地对自定义类型进行运算。本章还会深入讲解语言本身的某些特性是如何实现的。
表 12-1:运算符重载的特型汇总表
12.1 算术运算符与按位运算符
在 Rust 中,表达式 a + b 实际上是 a.add(b) 的简写形式,也就是对标准库中 std::ops::Add 特型的 add 方法的调用。Rust 的标准数值类型都实现了 std::ops::Add。为了使表达式 a + b 适用于 Complex 值,num crate 也为 Complex 实现了这个特型。还有一些类似的特型覆盖了其他运算符:a * b 是 a.mul(b) 的简写形式,也就是对 std::ops::Mul 特型的 mul 方法的调用,std::ops::Neg 实现了前缀取负运算符 -,等等。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了 Rust 中的运算符重载和相等性比较的实现方法。通过实现特定的内置特型,自定义类型可以支持算术运算符和其他运算符的重载,类似于 C++、C#、Python 和 Ruby 中的运算符重载。文章详细介绍了算术运算符和按位运算符的实现原理,并通过实例代码展示了如何为自定义类型实现加法运算符的重载,以及如何泛化实现适用于不同类型的加法运算。此外,还介绍了一元运算符、二元运算符和复合赋值运算符的内置特型及其实现方法。 另外,文章还探讨了 Rust 中的相等性比较,以及如何使用 <code>PartialEq</code> 和 <code>Eq</code> 特型来实现相等性比较,展示了 Rust 在处理相等性比较时的灵活性和严谨性。此外,还介绍了有序比较和索引表达式的规定,通过实现相应的特型,可以规定不同类型的值之间的顺序关系,以及索引表达式的作用方式。 总之,本文内容丰富,涵盖了 Rust 中运算符重载、相等性比较和有序比较等方面的知识,适合想要深入了解 Rust 特性的读者阅读学习。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 程序设计(第 2 版)》
《Rust 程序设计(第 2 版)》
立即购买
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论