【PhysUnits】15.15 变量类型(variable.rs)
一、源码
这段代码定义了一个泛型结构体 Var 和相关的数学运算实现,主要用于封装数值类型并提供基本的算术运算功能。
/** 变量结构体 Var* 该结构体泛型参数 T 需满足 Numeric 约束*/use std::ops::{Neg, Add, Sub, Mul};/// 定义 Numeric trait,约束 T 必须实现基本数值运算
pub trait Numeric:Neg<Output = Self> + Add<Output = Self> + Sub<Output = Self> + Mul<Output = Self> + Copy + Sized
{}// 为基本类型实现 Numeric
impl Numeric for i64 {}
impl Numeric for f64 {}/// 变量结构体,封装一个泛型值 T
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct Var<T: Numeric>(pub T);/// 实现 Var 与 Var 的乘法运算
/// V * V
impl<T: Numeric> Mul<Var<T>> for Var<T> {type Output = Self;fn mul(self, b: Self) -> Self::Output {Var(self.0 * b.0)}
}/// 实现 Var 与 Var 的加法运算
/// V + V
impl<T: Numeric> Add for Var<T> {type Output = Self;fn add(self, b: Self) -> Self::Output {Var(self.0 + b.0)}
}/// 实现 Var 的取反运算
/// -V
impl<T: Numeric> Neg for Var<T> {type Output = Self;fn neg(self) -> Self::Output {Var(-self.0)}
}/// 实现 Var 与 Var 的减法运算
/// V - V
impl<T: Numeric> Sub for Var<T> {type Output = Self;fn sub(self, b: Self) -> Self::Output {Var(self.0 - b.0)}
}
二、Numeric Trait 定义
pub trait Numeric:Neg<Output = Self> + Add<Output = Self> + Sub<Output = Self> + Mul<Output = Self> + Copy + Sized
{}
-
定义了一个名为 Numeric 的 trait,它要求实现该 trait 的类型必须支持以下操作:
-
取负 (Neg): -x
-
加法 (Add): x + y
-
减法 (Sub): x - y
-
乘法 (Mul): x * y
-
可复制 (Copy trait): 允许按位复制
-
大小固定 (Sized trait): 编译时已知大小
-
-
Output = Self 表示这些运算的返回值类型与自身类型相同。
三、为基本类型实现 Numeric
impl Numeric for i64 {}
impl Numeric for f64 {}
- 为 i64 (64位整数) 和 f64 (64位浮点数) 实现了 Numeric trait,表明这些类型可以进行上述基本运算。
四、Var 结构体定义
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct Var<T: Numeric>(pub T);
-
定义了一个泛型结构体 Var,其中 T 必须实现 Numeric trait。
-
使用了元组结构体的形式,包含一个公开的字段 T。
-
自动派生了一些常用 trait:
-
Debug: 支持格式化打印
-
Clone 和 Copy: 允许复制
-
PartialEq: 支持部分相等比较
-
Default: 提供默认值
-
五、运算实现
为 Var 实现了四种基本运算:
乘法 (Mul)
impl<T: Numeric> Mul<Var<T>> for Var<T> {type Output = Self;fn mul(self, b: Self) -> Self::Output {Var(self.0 * b.0)}
}
-
实现 Var * Var 的运算
-
返回新的 Var,其值为两个 Var 内部值的乘积
加法 (Add)
impl<T: Numeric> Add for Var<T> {type Output = Self;fn add(self, b: Self) -> Self::Output {Var(self.0 + b.0)}
}
-
实现 Var + Var 的运算
-
返回新的 Var,其值为两个 Var 内部值的和
取负 (Neg)
impl<T: Numeric> Neg for Var<T> {type Output = Self;fn neg(self) -> Self::Output {Var(-self.0)}
}
-
实现 -Var 的运算
-
返回新的 Var,其值为原 Var 内部值的负数
减法 (Sub)
impl<T: Numeric> Sub for Var<T> {type Output = Self;fn sub(self, b: Self) -> Self::Output {Var(self.0 - b.0)}
}
-
实现 Var - Var 的运算
-
返回新的 Var,其值为两个 Var 内部值的差
六、总结
这段代码创建了一个通用的数值包装类型 Var,它可以封装任何实现了基本算术运算的类型(目前是 i64 和 f64),并为这些包装值提供了加减乘和取负运算的能力。这种设计在需要统一处理不同数值类型或需要为数值添加额外功能的场景中很有用。