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

【PhysUnits】13 减法操作(sub.rs)

一、源码

这段代码定义了一个自定义的减法 trait MySub 并为实现了特定约束的整数类型实现了这个 trait。

use super::basic::Integer;
use core::ops::{Neg, Sub, Add};pub trait MySub<Rhs = Self> {type Output;fn my_sub(self, rhs: Rhs) -> Self::Output;
}impl<I1: Integer, I2: Integer> MySub<I2> for I1
whereI1: Add<<I2 as Neg>::Output>,I2: Neg,
{type Output = <I1 as Add<<I2 as Neg>::Output>>::Output;#[inline]fn my_sub(self, rhs: I2) -> Self::Output {self + (-rhs)}
}

二、导入部分

use super::basic::Integer;
use core::ops::{Neg, Sub, Add};
  • 从父模块的 basic 子模块导入 Integer trait

  • 从核心库导入 Neg(取负)、Sub(减法) 和 Add(加法) 这三个操作 trait

三、自定义减法 trait 定义

pub trait MySub<Rhs = Self> {type Output;fn my_sub(self, rhs: Rhs) -> Self::Output;
}
`
+ 定义了一个名为 MySub 的公共 trait+ 使用泛型参数 Rhs (Right Hand Side 的缩写),默认值为 Self (即实现该 trait 的类型自身)+ 声明了一个关联类型 Output 表示运算结果的类型+ 定义了一个方法 my_sub,接收自身和右操作数,返回 Output 类型的结果### 四、trait 实现
```rust
impl<I1: Integer, I2: Integer> MySub<I2> for I1
whereI1: Add<<I2 as Neg>::Output>,I2: Neg,
{type Output = <I1 as Add<<I2 as Neg>::Output>>::Output;#[inline]fn my_sub(self, rhs: I2) -> Self::Output {self + (-rhs)}
}
  • 为所有实现了 Integer 的类型 I1 和 I2 实现 MySub

  • where 子句约束:

    • I1 必须能加上 I2 的负值 (I1: Add<::Output>)

    • I2 必须能取负 (I2: Neg)

  • 关联类型 Output 定义为 I1 加 I2 的负值的结果类型

  • my_sub 方法实现为 self + (-rhs),即通过加负来实现减

  • #[inline] 提示编译器考虑内联此方法以提高性能

五、关键点解析

  1. 数学原理:
  • 这段代码实现了减法作为加负数的操作 (a - b = a + (-b))

  • 这是数学上减法的标准定义方式

  1. 类型系统:
  • 使用了复杂的类型约束确保类型安全

  • I2 as Neg>::Output 获取 I2 取负后的类型

  • I1 as Add<…>::Output 获取 I1 与某类型相加的结果类型

  1. 设计考虑:
  • 自定义 MySub trait 是为了绕过 Rust 的孤儿规则

  • 保持了与标准库 Sub trait 相似的接口设计

六、使用示例

假设有以下类型:

struct MyInt(i32);impl Integer for MyInt {...}
impl Neg for MyInt {type Output = MyInt;fn neg(self) -> Self::Output {...}
}
impl Add for MyInt {type Output = MyInt;fn add(self, rhs: Self) -> Self::Output {...}
}

可以这样使用:

let a = MyInt(5);
let b = MyInt(3);
let c = a.my_sub(b);  // 相当于 5 - 3

七、与标准库 Sub 的区别

  1. 避免了孤儿规则问题,因为 MySub 是本地的

  2. 方法名改为 my_sub 而非 sub

  3. 其他方面保持了与标准库 Sub 相同的设计理念

这种模式在需要扩展外部类型功能时很常见,特别是在无法直接实现外部 crate 的 trait 时。

http://www.xdnf.cn/news/638155.html

相关文章:

  • setup.py Pip wheel
  • MySQL权限管理:层级化作用域、权限分类、操作命令
  • 基于大模型的大肠癌全流程预测与诊疗方案研究报告
  • Qt环境的搭建
  • 互联网大厂Java求职面试:短视频平台大规模实时互动系统架构设计
  • [论文品鉴] DeepSeek V3 最新论文 之 MTP
  • python期末速成
  • SpringBoot+MyBatis
  • 深入探索AI模型工程:算法三大门派与监督学习的魅力
  • 财管-1-财务分析、评价和预测
  • 渗透测试靶场PortSwiggerLabs-xss(1-10)lab详解
  • QTableWidgetItem函数的介绍
  • 新闻推荐预测系统实战指南
  • 【编程实践】利用open3d对点云进行聚类并可视化
  • 02.Embedding:数字变矩阵
  • Android-flutter学习总结
  • 计算机基础核心课程
  • Java线程同步:从多线程协作到银行账户安全
  • day28JS+Node-JS打包工具Webpack
  • 智能办公系统 — 审批管理模块 · 开发日志
  • Llama 4中文调优全流程解
  • Linux Kernel调试:强大的printk(三)
  • Kotlin Native与C/C++高效互操作:技术原理与性能优化指南
  • 论文审稿之我对SCI写作的思考
  • 聊一聊接口测试如何设计有效的错误响应测试用例
  • Multivalued Dependencies
  • CMake指令:find_package()
  • 【HarmonyOS5】DevEco Studio 使用指南:代码阅读与编辑功能详解
  • Java 接口
  • Flink 常用算子详解与最佳实践