源码
rust
/*
* 变量结构体 Variable
* 该结构体泛型参数 T 需满足 Numeric 约束
*/
use std::ops::{Mul, Add, Neg, Sub};
//use super::constant::{Zero, One, DecOne};
use super::fixed::Fixed;
/// 定义 Numeric trait,约束 T 必须实现基本数值运算
pub trait Numeric:
Mul<Output = Self> +
Add<Output = Self> +
Sub<Output = Self> +
Neg<Output = Self> +
Copy +
Sized
{}
// 为基本类型实现 Numeric
impl Numeric for i32 {}
impl Numeric for f32 {}
impl Numeric for f64 {}
impl Numeric for Fixed {}
/// 变量结构体,封装一个泛型值 T
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Variable<T: Numeric>(pub T);
/// 实现 Variable 与 Variable 的乘法运算
/// V * V
impl<T: Numeric> Mul<Variable<T>> for Variable<T> {
type Output = Self;
fn mul(self, b: Self) -> Self::Output {
Variable(self.0 * b.0)
}
}
/// 实现 Variable 与 Variable 的加法运算
/// V + V
impl<T: Numeric> Add for Variable<T> {
type Output = Self;
fn add(self, b: Self) -> Self::Output {
Variable(self.0 + b.0)
}
}
/// 实现 Variable 的取反运算
/// -V
impl<T: Numeric> Neg for Variable<T> {
type Output = Self;
fn neg(self) -> Self::Output {
Variable(-self.0)
}
}
/// 实现 Variable 与 Variable 的减法运算
/// V - V
impl<T: Numeric> Sub for Variable<T> {
type Output = Self;
fn sub(self, b: Self) -> Self::Output {
Variable(self.0 - b.0)
}
}
// ========== 跨类型运算 ==========
impl Add<Fixed> for f32 {
type Output = f32;
fn add(self, rhs: Fixed) -> f32 {
self + f32::from(rhs)
}
}
impl Mul<Fixed> for f32 {
type Output = f32;
fn mul(self, rhs: Fixed) -> f32 {
self * f32::from(rhs)
}
}
impl Add<Fixed> for f64 {
type Output = f64;
fn add(self, rhs: Fixed) -> f64 {
self + f64::from(rhs)
}
}
impl Mul<Fixed> for f64 {
type Output = f64;
fn mul(self, rhs: Fixed) -> f64 {
self * f64::from(rhs)
}
}
代码分析
这段代码定义了一个泛型结构体 Variable 和相关运算实现,主要用于封装数值类型并提供算术运算功能。它与以前的variable.rs类似,针对Zero, One, DecOne结构体及2D CAD精简了代码。下面逐步解释:
- Numeric Trait 定义
rust
pub trait Numeric:
Mul<Output = Self> + // 可乘
Add<Output = Self> + // 可加
Sub<Output = Self> + // 可减
Neg<Output = Self> + // 可取负
Copy + // 可拷贝
Sized // 大小固定
{}
这个 trait 定义了数值类型需要满足的基本运算能力,任何实现 Numeric 的类型必须支持乘法、加法、减法和取反运算,并且是可拷贝的、大小固定的类型。
- 为基本类型实现 Numeric
rust
impl Numeric for i32 {}
impl Numeric for f32 {}
impl Numeric for f64 {}
impl Numeric for Fixed {}
为四种类型实现了 Numeric trait:32位整数、32位浮点数、64位浮点数和一个自定义的定点数 Fixed 。
- Variable 结构体
rust
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Variable<T: Numeric>(pub T);
这是一个泛型结构体,包装了一个 Numeric 类型的值。它派生了一些常用 trait:
-
Debug: 可打印调试信息
-
Clone/Copy: 可克隆/拷贝
-
PartialEq: 可比较相等性
- 基本运算实现
为 Variable 实现了四种基本运算:
乘法
rust
impl<T: Numeric> Mul<Variable<T>> for Variable<T> {
fn mul(self, b: Self) -> Self::Output {
Variable(self.0 * b.0)
}
}
实现 Variable * Variable 的运算,返回新的 Variable。
加法
rust
impl<T: Numeric> Add for Variable<T> {
fn add(self, b: Self) -> Self::Output {
Variable(self.0 + b.0)
}
}
实现 Variable + Variable 的运算。
取反
rust
impl<T: Numeric> Neg for Variable<T> {
fn neg(self) -> Self::Output {
Variable(-self.0)
}
}
实现 -Variable 的运算。
减法
rust
impl<T: Numeric> Sub for Variable<T> {
fn sub(self, b: Self) -> Self::Output {
Variable(self.0 - b.0)
}
}
实现 Variable - Variable 的运算。
- 跨类型运算
实现了 Fixed 类型与 f32/f64 的混合运算:
rust
// f32 + Fixed → f32
impl Add<Fixed> for f32 {
fn add(self, rhs: Fixed) -> f32 {
self + f32::from(rhs)
}
}
// f32 * Fixed → f32
impl Mul<Fixed> for f32 {
fn mul(self, rhs: Fixed) -> f32 {
self * f32::from(rhs)
}
}
// f64 + Fixed → f64
impl Add<Fixed> for f64 {
fn add(self, rhs: Fixed) -> f64 {
self + f64::from(rhs)
}
}
// f64 * Fixed → f64
impl Mul<Fixed> for f64 {
fn mul(self, rhs: Fixed) -> f64 {
self * f64::from(rhs)
}
}
这些实现允许浮点数与 Fixed 类型直接进行加减乘运算,运算结果会保持浮点类型。通过 From trait 将 Fixed 转换为浮点数后再运算。
总结
这段代码的主要目的是:
-
定义一个通用的数值包装类型 Variable
-
为包装类型实现基本算术运算
-
支持 Fixed 类型与浮点数的混合运算
这种设计常用于需要统一处理多种数值类型的场景,比如元素类型为泛型的矩阵计算等数学工具时。