了解Rust里的偏序关系

作者在学习Rust过程中遇到将二维数组单元格抽象为枚举类的问题,发现Rust中枚举不直接支持`==`操作,需实现`PartialEq`。通过了解偏序关系和自反性,了解到Rust编译器提供了`#[derive(Debug,PartialEq)]`自动处理此类情况,简化了编程过程。
摘要由CSDN通过智能技术生成

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

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值