【学Rust写CAD】25 变量类(variable.rs)

源码

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精简了代码。下面逐步解释:

  1. Numeric Trait 定义
rust 复制代码
pub trait Numeric: 
    Mul<Output = Self> +  // 可乘
    Add<Output = Self> +  // 可加
    Sub<Output = Self> +  // 可减
    Neg<Output = Self> +  // 可取负
    Copy +               // 可拷贝
    Sized                // 大小固定
{}

这个 trait 定义了数值类型需要满足的基本运算能力,任何实现 Numeric 的类型必须支持乘法、加法、减法和取反运算,并且是可拷贝的、大小固定的类型。

  1. 为基本类型实现 Numeric
rust 复制代码
impl Numeric for i32 {}
impl Numeric for f32 {}
impl Numeric for f64 {}
impl Numeric for Fixed {}

为四种类型实现了 Numeric trait:32位整数、32位浮点数、64位浮点数和一个自定义的定点数 Fixed 。

  1. Variable 结构体
rust 复制代码
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Variable<T: Numeric>(pub T);

这是一个泛型结构体,包装了一个 Numeric 类型的值。它派生了一些常用 trait:

  • Debug: 可打印调试信息

  • Clone/Copy: 可克隆/拷贝

  • PartialEq: 可比较相等性

  1. 基本运算实现
    为 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 的运算。

  1. 跨类型运算
    实现了 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 转换为浮点数后再运算。

总结

这段代码的主要目的是:

  1. 定义一个通用的数值包装类型 Variable

  2. 为包装类型实现基本算术运算

  3. 支持 Fixed 类型与浮点数的混合运算

这种设计常用于需要统一处理多种数值类型的场景,比如元素类型为泛型的矩阵计算等数学工具时。

相关推荐
Gogo81623 分钟前
BigInt 与 Number 的爱恨情仇,为何大佬都劝你“能用 Number 就别用 BigInt”?
后端
fuquxiaoguang24 分钟前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
毕设源码_廖学姐1 小时前
计算机毕业设计springboot招聘系统网站 基于SpringBoot的在线人才对接平台 SpringBoot驱动的智能求职与招聘服务网
spring boot·后端·课程设计
野犬寒鸦3 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
逍遥德3 小时前
如何学编程之01.理论篇.如何通过阅读代码来提高自己的编程能力?
前端·后端·程序人生·重构·软件构建·代码规范
MX_93594 小时前
Spring的bean工厂后处理器和Bean后处理器
java·后端·spring
程序员泠零澪回家种桔子5 小时前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
源代码•宸6 小时前
大厂技术岗面试之谈薪资
经验分享·后端·面试·职场和发展·golang·大厂·职级水平的薪资
晚霞的不甘6 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
喵叔哟6 小时前
06-ASPNETCore-WebAPI开发
服务器·后端·c#