Rust里的偏序关系
最近在学Rust,Rust真好用啊!
看了一点视频教程之后想练练手,然后就想着吧之前的生成迷宫的代码用Rust重构一下,顺便学习一下大佬的们的写法,各种功能的提炼啊,抽象啊,神乎其技.
然后遇到了这个问题:
pub enum CellType {
/// 边界
Border,
/// 初始网格
Wall,
/// 待定单元
PendingUnit,
/// 待定墙壁
PendingWall,
/// 确定单元
DetermineUnit,
/// 联通网格
ConnectedWall,
/// 起点
StartPoint,
/// 终点
EndPoint,
/// 路径
Path,
}
我想把二维数组里的单元格,从数字表示抽象成一个枚举类.就这样改了.但是改完了报错:
binary operation `==` cannot be applied to type `CellType`
...
告诉我这个类型不能用 ==
运算符
这和C++就不一样啦,C++和RUST是把枚举看作整数存储的,但是Rust在声明一个枚举的时候会把它和整数看成完全不同的东西.
当时我查的结果是这样的,==
运算符基于Eq
这个trait
,而Eq
基于PartialEq
所以就实现呗:
impl PartialEq for CellType {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(CellType::Border, CellType::Border) => true,
(CellType::ConnectedWall,CellType::ConnectedWall) => true,
(CellType::DetermineUnit,CellType::DetermineUnit) => true,
(CellType::EndPoint,CellType::EndPoint) => true,
(CellType::Path,CellType::Path) => true,
(CellType::PendingUnit,CellType::PendingUnit) => true,
(CellType::PendingWall,CellType::PendingWall) => true,
(CellType::StartPoint,CellType::StartPoint) => true,
(CellType::Wall,CellType::Wall) => true,
_ => false,
}
}
}
当时我就傻了,尼玛我终于体会到计算机专业的离散数学有啥用了.
这是啥?偏序关系的自反性!
但是这么实现多麻烦哪,谁家好人天天写代码还得翻集合论呐!这代码默认不符合偏序关系?至于嘛!
肯定有类似默认处理的方法,接着查!
然后我发现了这个:
#[derive(Debug, PartialEq)]
pub enum CellType {
...
}
Rust的编译器多精啊,早就算到了我懒得自己写,然后就可以用这个标记(官方叫属性attribute
啥的)让编译器自动实现这些trait