【PhysUnits】2 Scalar<T> 标量元组结构体(scalar/mod.rs)

Scalar<T> 标量元组结构体分析

泛型标量元组结构体 Scalar<T>包装了一个类型为 T 的值。我将解释这个结构体并根据不同的 T 类型讨论如何实现不同的方法和常量。

基本结构

rust 复制代码
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Scalar<T>(pub T);
  • Scalar<T> 是一个元组结构体,包含一个类型为 T 的单一字段
  • 使用了多个 derive 属性自动实现常见 trait:
    • Debug: 允许打印调试信息
    • Copy: 表示类型可以通过位复制
    • Clone: 提供 clone() 方法
    • PartialEq, Eq: 实现相等比较
    • PartialOrd, Ord: 实现排序比较

根据 T 类型的不同实现

要为不同的 T 类型实现不同的方法和常量,可以使用 Rust 的 trait 系统和条件实现。以下是三种特例的实现方式:

1. 有符号整数特例

rust 复制代码
impl<T> Scalar<T>
where
    T: SignedInt, // 假设有这个trait或者使用std::ops::Neg + 其他整数trait
{
    pub fn abs(&self) -> Self {
        Scalar(if self.0 < T::zero() { -self.0 } else { self.0 })
    }
    
    pub const MIN: Self = Scalar(T::MIN);
    pub const MAX: Self = Scalar(T::MAX);
}

2. 浮点数特例

rust 复制代码
impl<T> Scalar<T>
where
    T: Float, // 比如使用num_traits::Float或std::float特性
{
    pub fn sqrt(&self) -> Self {
        Scalar(self.0.sqrt())
    }
    
    pub fn is_nan(&self) -> bool {
        self.0.is_nan()
    }
    
    pub const EPSILON: Self = Scalar(T::EPSILON);
    pub const INFINITY: Self = Scalar(T::INFINITY);
}

3. 自定义定点数特例

rust 复制代码
impl<T> Scalar<T>
where
    T: FixedPoint, // 自定义trait
{
    pub fn to_f64(&self) -> f64 {
        self.0.to_f64()
    }
    
    pub fn from_f64(value: f64) -> Self {
        Scalar(T::from_f64(value))
    }
    
    pub const SCALE_FACTOR: Self = Scalar(T::SCALE_FACTOR);
}

完整的实现示例

rust 复制代码
use std::ops::Neg;

// 自定义trait定义
pub trait SignedInt: Neg<Output = Self> + PartialOrd + Copy {
    const MIN: Self;
    const MAX: Self;
    fn zero() -> Self;
}

pub trait FixedPoint {
    fn to_f64(&self) -> f64;
    fn from_f64(value: f64) -> Self;
    const SCALE_FACTOR: Self;
}

// 为内置类型实现SignedInt
impl SignedInt for i32 {
    const MIN: i32 = i32::MIN;
    const MAX: i32 = i32::MAX;
    fn zero() -> i32 { 0 }
}

// Scalar实现
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Scalar<T>(pub T);

// 有符号整数实现
impl<T> Scalar<T>
where
    T: SignedInt,
{
    pub fn abs(&self) -> Self {
        Scalar(if self.0 < T::zero() { -self.0 } else { self.0 })
    }
    
    pub const MIN: Self = Scalar(T::MIN);
    pub const MAX: Self = Scalar(T::MAX);
}

// 自定义定点数实现
impl<T> Scalar<T>
where
    T: FixedPoint,
{
    pub fn to_f64(&self) -> f64 {
        self.0.to_f64()
    }
    
    pub fn from_f64(value: f64) -> Self {
        Scalar(T::from_f64(value))
    }
    
    pub const SCALE_FACTOR: Self = Scalar(T::SCALE_FACTOR);
}

使用方式

根据不同的类型参数 TScalar<T> 会提供不同的方法和常量:

rust 复制代码
let int_scalar = Scalar(-5i32);
println!("Abs: {:?}", int_scalar.abs()); // 可用abs()方法
println!("Max: {:?}", Scalar::<i32>::MAX); // 可用MAX常量

// 对于浮点数类型,会有sqrt()等方法
// 对于自定义定点数类型,会有to_f64()等方法

这种设计模式允许您为不同类型的标量提供特定于类型的行为,同时保持统一的接口。

相关推荐
SomeB1oody2 小时前
【RustyML入门】3.7. 循环层
开发语言·后端·机器学习·rust·教程
k4m7v2pz1 天前
Rust 长跑守护进程日志治理:切分、时区与结构化
开发语言·后端·rust·日志系统·日志轮转·ndjson
k4m7v2pz1 天前
Rust 高并发 WebSocket 连接管理:从线程地狱到 tokio 异步架构
websocket·架构·rust·并发编程·tokio
k4m7v2pz1 天前
Rust 规则热重载实战:用 serde_json + notify 告别重启
开发语言·rust·json·规则引擎·notify·热重载
rustfs1 天前
GitLab 如何与 RustFS 集成?
分布式·rust·gitlab
龙智DevSecOps解决方案1 天前
Perforce QAC + Klocwork 视频教程:Rust 与 C/C++ 混合项目静态分析演示
rust·静态分析·perforce·klocwork·qac·代码合规
程序员爱钓鱼1 天前
Rust 生命周期常见错误详解:看懂编译器报错并正确修复
前端·后端·rust
特立独行的猫a1 天前
Windows安装Rust环境 Clang替代GCC MinGW环境LLVM工具链(详细教程)
开发语言·windows·rust·mingw·环境搭建·llvm
红尘散仙2 天前
浏览器不能监听端口、没有文件系统,凭什么能点对点传文件?
rust·webrtc·webassembly
nnerddboy2 天前
Rust教程06:ESP32-rust环境搭建
开发语言·后端·rust