算术操作符重载
use std::ops::Add;
impl Add for Complex<i32> {
type Output = Complex<i32>;
fn add(self, rhs: Self) -> Self {
Complex { re: self.re + rhs.re, im: self.im + rhs.im }
}
}
一个普适的泛型实现,只要复数组件本身支 持相加就行:
use std::ops::Add;
impl<T> Add for Complex<T>
where T: Add<Output=T>
{
type Output = Self;
fn add(self, rhs: Self) -> Self {
Complex { re: self.re + rhs.re, im: self.im + rhs.im }
}
}
相等测试
Rust 的相等操作符 == 和 != 是对调用 std::cmp::PartialEq 特型 的方法 eq 和 ne 的简写:
assert_eq!(x == y, x.eq(&y)); assert_eq!(x != y, x.ne(&y));
impl<T: PartialEq> PartialEq for Complex<T> {
fn eq(&self, other: &Complex<T>) -> bool {
self.re == other.re && self.im == other.im
}
}
Rust 的 操作符符合 IEEE 对相等关系的前两个要求,而在涉及 IEEE 浮点值时明显不符合第三个条件。这就叫作 部分相等关系 (partial equivalence relation),所以 Rust 使用 PartialEq 这 个名字为 操作符定义了内置的特型
如果你的泛型代码 需要保证完全相等的关系,那可以使用 std::cmp::Eq 特型作为绑 定,它表示完全相等关系。