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

【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()等方法

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

http://www.xdnf.cn/news/4600.html

相关文章:

  • leetcode刷题日记——随机链表的复制
  • 应急响应靶场web3:知攻善防实验室
  • 使用英伟达 Riva 和 OpenAI 构建 AI 聊天机器人
  • 普通IT的股票交易成长史--20250507晚复盘
  • J2 WebScarab 安装指南详细步骤与配置方法
  • 数据报(Datagram)与虚电路(Virtual Circuit)的区别
  • SQL Server 存储过程开发三层结构规范
  • 生物化学笔记:神经生物学概论12 大脑全景图 知觉、行为和语言 注意力
  • vue3的页面跳转方法汇总(路由跳转,组件跳转)
  • 微信小程序开发,登录注册实现
  • ​​Dongle​​(中文常称“加密狗”或“适配器”)
  • 智慧医疗时代下的医疗设备智能控费系统解决方案
  • 【C++】C++中的类型转换
  • GoFrame框架下优雅使用Redis:从入门到实战的最佳实践
  • docker搭建DeepSeek+Dify构建个人知识库
  • 在 Ubuntu 系统中,挂起(Suspend)和休眠(Hibernate)
  • 如何做界面自动化工具选择?
  • 深入解析Spring Boot项目目录结构:从新手到规范实践
  • Git 撤销已commit但未push的文件
  • overflow使用
  • 力扣热题100之回文链表
  • Python学习之路(八)-多线程和多进程浅析
  • 《MySQL:MySQL索引特性》
  • 解锁 Postgres 扩展日!与瀚高共探 C/Java 跨语言扩展技术的边界与未来
  • si551x时钟芯片linux下调试总结
  • 基于 SpringBoot + Vue 的校园管理系统设计与实现
  • STM32的看门狗
  • English of Root for May 7th
  • 工程师转型算法工程师 深入浅出理解transformer-手搓板
  • zst-2001 历年真题 知识产权