Rust 程序设计(第 2 版)
Jim Blandy, Jason Orendorff, Leonora F. S. Tindall
软件工程师
1469 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
课程目录
已完结/共 41 讲
时长 02:41
时长 06:30
时长 10:04
时长 01:05
时长 50:06
时长 31:35
时长 34:39
时长 29:11
时长 37:15
时长 23:44
时长 44:19
时长 29:54
时长 39:01
时长 01:38
时长 01:15
时长 00:37
Rust 程序设计(第 2 版)
15
15
1.0x
00:00/00:00
登录|注册

第 12 章 运算符重载

在第 2 章展示的曼德博集绘图器中,我们使用了 num crate 的 Complex 类型来表示复平面上的数值:
#[derive(Clone, Copy, Debug)]
struct Complex<T> {
/// 复数的实部
re: T,
/// 复数的虚部
im: T,
}
使用 Rust 的 + 运算符和 * 运算符,可以像对任何内置数值类型一样对 Complex 进行加法运算和乘法运算:
z = z * z + c;
你也可以让自己的类型支持算术运算符和其他运算符,只要实现一些内置特型即可。这叫作运算符重载,其效果跟 C++、C#、Python 和 Ruby 中的运算符重载很相似。
运算符重载的特型可以根据其支持的语言特性分为几类,如表 12-1 所示。本章将逐一介绍每个类别。我们不仅要帮你把自己的类型很好地集成到语言中,而且要让你更好地了解如何编写泛型函数,比如 11.1.2 节讲过的 dot_product 函数,该函数能使用运算符自然而然地对自定义类型进行运算。本章还会深入讲解语言本身的某些特性是如何实现的。
表 12-1:运算符重载的特型汇总表
类别特型运算符
一元运算符std::ops::Neg std::ops::Not-x !x
算术运算符std::ops::Add std::ops::Sub std::ops::Mul std::ops::Div std::ops::Remx + y x - y x * y x / y x % y
按位运算符std::ops::BitAnd std::ops::BitOr std::ops::BitXor std::ops::Shl std::ops::Shrx & y x | y x ^ y x << y x >> y
复合赋值算术运算符std::ops::AddAssign std::ops::SubAssign std::ops::MulAssign std::ops::DivAssign std::ops::RemAssignx += y x -= y x *= y x /= y x %= y
复合赋值按位运算符std::ops::BitAndAssign std::ops::BitOrAssign std::ops::BitXorAssign std::ops::ShlAssign std::ops::ShrAssignx &= y x |= y x ^= y x <<= y x >>= y
比较std::cmp::PartialEq std::cmp::PartialOrdx == yx != y x < yx <= yx > yx >= y
索引std::ops::Index std::ops::IndexMutx[y]&x[y] x[y] = z&mut x[y]

12.1 算术运算符与按位运算符

在 Rust 中,表达式 a + b 实际上是 a.add(b) 的简写形式,也就是对标准库中 std::ops::Add 特型的 add 方法的调用。Rust 的标准数值类型都实现了 std::ops::Add。为了使表达式 a + b 适用于 Complex 值,num crate 也为 Complex 实现了这个特型。还有一些类似的特型覆盖了其他运算符:a * ba.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 版)》
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部