当前位置: 首页 > news >正文

【unitrix】 6.19 Ord特质(ord.rs)

一、源码

这段代码定义了一个标记特征(marker trait)Ord 和三个实现,用于将类型标记与 Rust 标准库中的 Ordering 枚举关联起来。

use crate::sealed::Sealed;
use core::cmp::Ordering;
use crate::number::{Greater, Equal, Less};
/// 用于标记类型 `Greater`、`Equal` 和 `Less` 的**标记特征**
pub trait Ord: Sealed {fn to_ordering() -> Ordering;
}/// 返回 `core::cmp::Ordering::Greater`
impl Ord for Greater {#[inline]fn to_ordering() -> Ordering {Ordering::Greater}
}/// 返回 `core::cmp::Ordering::Less`
impl Ord for Less {#[inline]fn to_ordering() -> Ordering {Ordering::Less}
}/// 返回 `core::cmp::Ordering::Equal`
impl Ord for Equal {#[inline]fn to_ordering() -> Ordering {Ordering::Equal}
}

二、源码分析

  1. 导入和特征定义

use crate::sealed::Sealed;
use core::cmp::Ordering;
use crate::number::{Greater, Equal, Less};pub trait Ord: Sealed {fn to_ordering() -> Ordering;
}
  • Sealed: 这是一个标记特征,用于限制特征只能被当前 crate 中的类型实现(密封模式,防止外部实现)。

  • Ordering: Rust 标准库中的枚举,表示比较结果(Less、Equal、Greater)。

  • Greater/Equal/Less: 用户定义的标记类型(零大小类型,ZST)。

  • Ord trait: 定义了一个关联函数 to_ordering(),返回 Ordering 值。它要求实现者必须也实现 Sealed(确保只有当前 crate 能实现它)。

  1. 为 Greater、Equal、Less 实现 Ord

impl Ord for Greater {#[inline]fn to_ordering() -> Ordering {Ordering::Greater}
}impl Ord for Less {#[inline]fn to_ordering() -> Ordering {Ordering::Less}
}impl Ord for Equal {#[inline]fn to_ordering() -> Ordering {Ordering::Equal}
}
  • 为三个标记类型分别实现 Ord trait:

    • Greater → 返回 Ordering::Greater。

    • Less → 返回 Ordering::Less。

    • Equal → 返回 Ordering::Equal。

  • #[inline]: 提示编译器内联优化这些简单函数。

三、用途

这段代码的目的是将类型系统的信息(Greater/Equal/Less)转换为运行时的 Ordering 值。典型场景可能是在泛型编程中,通过类型参数决定比较行为,例如:


fn compare<T: Ord>() -> Ordering {T::to_ordering()
}assert_eq!(compare::<Greater>(), Ordering::Greater);

四、关键点

  1. 标记类型(ZST): Greater/Equal/Less 是零运行时开销的类型,仅用于编译期逻辑。

  2. 密封模式: Ord: Sealed 确保只有当前 crate 能实现这个 trait,避免外部破坏一致性。

  3. 编译期到运行时的转换: 将类型信息转换为运行时可用的 Ordering 值。

这种模式在类型级编程中很常见,例如在库设计或 DSL 中利用类型系统表达逻辑。

http://www.dtcms.com/a/303560.html

相关文章:

  • 【灰度实验】——图像预处理(OpenCV)
  • 2025年7月28日训练日志
  • 【三桥君】如何解决后端Agent和前端UI之间的交互问题?——解析AG-UI协议的神奇作用
  • 排水管网实时监测筑牢城市安全防线
  • 线程间-数据缓存机制(线程邮箱)
  • CDN架构全景图
  • STM32 usb HOST audio USB 音频设备 放音乐
  • springCloudAlibaba集成Dubbo
  • 【版本更新】火语言 0.9.94.0 更新
  • 虚拟面孔,真实革命
  • Product Hunt 每日热榜 | 2025-07-28
  • JAVA_EIGHTEEN_特殊文件
  • STM32——寄存器映射
  • LLaMA-Factory微调教程2:命令行sft微调
  • 【拓扑排序 缩点】P2272 [ZJOI2007] 最大半连通子图|省选-
  • 【跳跃游戏】
  • BUUCTF-MISC-[HBNIS2018]caesar1
  • Linux驱动22 --- RV1126 环境搭建设备树修改
  • 从零到一:我是如何用深度学习打造高性能书籍推荐系统的
  • mp核心功能
  • 零基础学习性能测试第九章:全链路追踪-项目实操
  • 猎板 PCB 控深槽工艺:5G 基站散热模块的关键支撑
  • 解决c++运行时提示:first defined here (重复定义问题)
  • **线程与进程的区别与联系**
  • Qt下使用图形视图框架实现图像上各图形绘制
  • 一个Pycharm窗口添加多个项目来满足运行多个项目的需求
  • linux常用的指令
  • HTML响应式SEO公司网站源码
  • MVSNet系列网络概述
  • 7寸工业模组 XA070Y2-L01芯显科技详细参数资料