算术操作符重载

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 特型作为绑 定,它表示完全相等关系。