🦀 Rust 运算符重载快问快答

测试你对 Rust 运算符重载、Trait 和相关概念的理解

10
题目数量
18
预计时间(分钟)
⭐⭐⭐⭐
难度等级
第1题 (判断题)
在Rust中,你可以为任何自定义类型重载几乎所有的运算符。
正确
错误

答案解析:

答案:正确

Rust 允许你通过实现 `std::ops` 中的特定 trait 来为自定义类型重载大部分运算符。例如,通过实现 `Add` trait 可以重载 `+` 运算符。但是,有一些运算符如赋值运算符 (`=`)、逻辑运算符 (`&&`, `||`) 和成员访问运算符 (`.`) 是不能被重载的。

第2题 (选择题)
要重载加法运算符 `+`,你需要实现哪个 trait?
std::ops::Add
std::ops::Plus
std::ops::Sum
std::ops::Addition

答案解析:

答案:std::ops::Add

在 Rust 中,`+` 运算符是通过实现 `std::ops::Add` trait 来重载的。这个 trait 要求你定义一个 `add` 方法,该方法接收 `self` 和另一个操作数,并返回它们的和。

第3题 (选择题)
为 `Point` 结构体实现乘法 `*` 运算符时,`mul` 方法的正确签名应该是什么?
struct Point { x: i32, y: i32 }
fn mul(self, rhs: Point) -> Point
fn mul(self, rhs: Self) -> Self::Output
fn mul(&self, rhs: &Point) -> Point
fn mul(self, rhs: i32) -> Point

答案解析:

答案:fn mul(self, rhs: Self) -> Self::Output

当你实现 `std::ops::Mul` trait 时,你需要定义一个 `mul` 方法。这个方法的签名通常是 `fn mul(self, rhs: Rhs) -> Self::Output`。在 `Mul` trait 中,`Rhs` 是一个关联类型,默认为 `Self`。`Output` 也是一个关联类型,表示乘法操作的结果类型。

第4题 (判断题)
实现 `PartialEq` trait 就足以让你的类型用于 `HashMap` 的键。
正确
错误

答案解析:

答案:错误

要让一个类型用作 `HashMap` 的键,它必须是可哈希的并且能够进行相等性比较。因此,除了 `PartialEq` 之外,你还需要实现 `Eq` 和 `Hash` trait。`Eq` 表示全等关系(reflexive, symmetric, transitive),而 `Hash` 提供了计算哈希值的能力。

第5题 (简答题)
如果你想通过 `println!("{}", my_type);` 来打印你的自定义类型,你需要实现哪个 trait?

答案解析:

答案:Display

要让一个类型能够被 `println!` 宏以 `{}` 格式化打印,你需要为它实现 `std::fmt::Display` trait。这个 trait 要求你实现一个 `fmt` 方法,它定义了如何将你的类型格式化为字符串。

第6题 (选择题)
以下哪个运算符在 Rust 中是不能被重载的?
`[]` (索引)
`&&` (逻辑与)
`-` (负号)
`*` (解引用)

答案解析:

答案:`&&` (逻辑与)

Rust 不允许重载逻辑运算符 `&&` 和 `||`,因为它们的短路求值行为无法通过 trait 来保证。其他几个运算符都可以通过实现相应的 trait 来重载:`[]` (Index/IndexMut), `-` (Neg), `*` (Deref)。

第7题 (判断题)
当你为一个类型实现了 `Add` trait 后,`+=` 运算符(通过 `AddAssign` trait)也会自动为你实现。
正确
错误

答案解析:

答案:错误

实现 `Add` 不会自动实现 `AddAssign`。它们是两个独立的 trait。`Add` 用于 `a + b`,而 `AddAssign` 用于 `a += b`。通常,如果你实现了 `Add`,你也应该考虑实现 `AddAssign` 以提供更完整的 API 和可能的性能优化。

第8题 (选择题)
在 `trait Add` 中,`Rhs` 的作用是什么?
定义加法操作的右操作数类型
定义加法操作的结果类型
定义左操作数的类型
这是一个生命周期参数

答案解析:

答案:定义加法操作的右操作数类型

`Rhs` (Right-Hand Side) 是 `Add` trait 中的一个泛型参数,它允许你定义右操作数的类型。例如,你可以为一个 `Point` 类型实现 `Add`,从而允许 `point + 10` 这样的操作。默认情况下,`Rhs` 是 `Self`,表示两个相同类型的实例相加。

第9题 (简答题)
要重载一元取反运算符(例如 `-v`),你需要实现哪个 trait?

答案解析:

答案:Neg

一元取反运算符 `-` 是通过实现 `std::ops::Neg` trait 来重载的。这个 trait 要求你定义一个 `neg` 方法,该方法接收 `self` 并返回其相反数。

第10题 (判断题)
所有与运算符重载相关的 trait 都在 `std::ops` 模块中。
正确
错误

答案解析:

答案:错误

虽然绝大多数用于运算符重载的 trait(如 `Add`, `Mul`, `Neg` 等)都在 `std::ops` 中,但也有一些例外。例如,用于格式化输出的 `Display` 和 `Debug` trait 位于 `std::fmt` 模块。同样,用于相等性比较的 `PartialEq` 和 `Eq` 位于 `std::cmp` 模块。

🎉
恭喜完成测验!
10/10
你对Rust运算符重载的掌握非常出色!