当前位置: 首页 > news >正文

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

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

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

基本结构

#[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. 有符号整数特例

impl<T> Scalar<T>
whereT: 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. 浮点数特例

impl<T> Scalar<T>
whereT: 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. 自定义定点数特例

impl<T> Scalar<T>
whereT: 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);
}

完整的实现示例

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>
whereT: 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>
whereT: 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> 会提供不同的方法和常量:

let int_scalar = Scalar(-5i32);
println!("Abs: {:?}", int_scalar.abs()); // 可用abs()方法
println!("Max: {:?}", Scalar::<i32>::MAX); // 可用MAX常量// 对于浮点数类型,会有sqrt()等方法
// 对于自定义定点数类型,会有to_f64()等方法

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

相关文章:

  • ABC 403
  • MySQL的基本操作
  • vue3+ts的watch全解!
  • 案例分享 | 攻克ADAS开发测试难题,实现单元动态测试新突破
  • 【Python】让Selenium 像Beautifulsoup一样,用解析HTML 结构的方式提取元素!
  • 分布式爬虫去重:Python + Redis实现高效URL去重
  • 【网络编程】二、UDP网络套接字编程详解
  • linux 怎么把trex-core-2.65用 crosstool-ng-1.27.0/编译
  • 96、数图求解(整数规划建模求解)
  • Python训练营打卡DAY18
  • 【anylogic_04】地铁站的人流仿真
  • Go 面向对象,封装、继承、多态
  • Win11 24H2首个热补丁下周推送!更新无需重启
  • 单地平面6层PCB设计实战:如何兼顾电源与信号完整性?
  • PyTorch常用命令(可快速上手PyTorch的核心功能,涵盖从数据预处理到模型训练的全流程)
  • Nacos源码—5.Nacos配置中心实现分析二
  • uniapp 搭配 uCharts
  • 回溯进阶(二):以解数独来深入了解映射
  • 【ARM AMBA AHB 入门 3.1 -- AHB控制信号】
  • 分区器(1)
  • 当创业热土遇上年轻气息,上海南汇新城发展如何再发力?
  • 外交部发言人就印巴局势升级答记者问
  • 第四轮伊美核谈判将于11日在阿曼举行
  • 欧洲史上最严重停电事故敲响警钟:能源转型如何保证电网稳定?
  • 印巴战火LIVE丨印巴互相发动无人机袭击,巴官员称两国已在国安层面接触
  • 印巴冲突升级,巴基斯坦股市重挫7.29%,创5年来最大单日跌幅