当前位置: 首页 > 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 时。

相关文章:

  • 右键管理工具,让你电脑实用更加顺滑!
  • 第11次课 while循环
  • 第三方检测机构如何凭借专业公正保障软件质量?资质有哪些?
  • 深入解析Java组合模式:构建灵活树形结构的艺术
  • PostgreSQL windows安装
  • 【AI Study】第三天,Python基础 - 同NumPy类似的类库
  • Global Securities Markets 第二章知识点总结
  • 英语六级-阅读篇
  • 嵌入式学习 D27:系统编程--进程
  • ind_knn_ad环境搭建和运行【用自己的数据集】
  • MySQL(36)如何使用CASE进行条件表达式?
  • dify_plugin数据库中的表总结
  • Typescript学习教程,从入门到精通,TypeScript 进阶语法知识点及案例代码详解(13)
  • 【解读—论文】引导性掩码表示学习以捕捉心电图的时空关系
  • 前端面试宝典---项目难点1-leaflet大数据量渲染优化
  • MATLAB在逐渐被Python淘汰吗
  • 计算机系统简介(一)
  • 《计算机组成原理》——第二章-10 现代计算机的总线结构
  • 2.7 寸 微雪墨水屏使用方法,及测试用例
  • LLM之Agent:Mem0的简介、安装和使用方法、案例应用之详细攻略
  • 芜湖做网站公司/企业seo排名有 名
  • excel做网站二维码/木卢seo教程
  • 无锡网站制作/市场调研报告范文
  • 温州网站改版/南宁seo推广外包
  • 旅游公司网站设计/太原高级seo主管
  • 天元建设集团有限公司中标情况分析/四川seo平台