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

【unitrix】 3.6 类型级数转基础类型(from.rs)

一、源码

这段代码是 Rust 语言中实现类型转换(type conversion)的示例,使用了类型级编程(type-level programming)技术。它定义了一些数字类型(如零、正一、负一等)到基本数值类型(如 i8、f32 等)的转换规则。

use core::convert::From;
use crate::number::{Z0, P1, N1, B0, B1, NonZero, Var, Primitive};// 数字类型到基本类型的转换实现
// =============================================// 实现Z0(零)到各种整数类型的转换
impl From<Z0> for i8 { fn from(_: Z0) -> i8 { 0 } }
impl From<Z0> for i16 { fn from(_: Z0) -> i16 { 0 } }
impl From<Z0> for i32 { fn from(_: Z0) -> i32 { 0 } }
impl From<Z0> for i64 { fn from(_: Z0) -> i64 { 0 } }
impl From<Z0> for i128 { fn from(_: Z0) -> i128 { 0 } }// 实现P1(正一)到各种整数类型的转换
impl From<P1> for i8 { fn from(_: P1) -> i8 { 1 } }
impl From<P1> for i16 { fn from(_: P1) -> i16 { 1 } }
impl From<P1> for i32 { fn from(_: P1) -> i32 { 1 } }
impl From<P1> for i64 { fn from(_: P1) -> i64 { 1 } }
impl From<P1> for i128 { fn from(_: P1) -> i128 { 1 } }// 实现N1(负一)到各种整数类型的转换
impl From<N1> for i8 { fn from(_: N1) -> i8 { -1 } }
impl From<N1> for i16 { fn from(_: N1) -> i16 { -1 } }
impl From<N1> for i32 { fn from(_: N1) -> i32 { -1 } }
impl From<N1> for i64 { fn from(_: N1) -> i64 { -1 } }
impl From<N1> for i128 { fn from(_: N1) -> i128 { -1 } }// 实现Z0(零)到浮点类型的转换
impl From<Z0> for f32 { fn from(_: Z0) -> f32 { 0.0 } }
impl From<Z0> for f64 { fn from(_: Z0) -> f64 { 0.0 } }// 实现P1(正一)到浮点类型的转换
impl From<P1> for f32 { fn from(_: P1) -> f32 { 1.0 } }
impl From<P1> for f64 { fn from(_: P1) -> f64 { 1.0 } }// 实现N1(负一)到浮点类型的转换
impl From<N1> for f32 { fn from(_: N1) -> f32 { -1.0 } }
impl From<N1> for f64 { fn from(_: N1) -> f64 { -1.0 } }// 二进制数字类型的转换实现
// =============================================/// 实现B0(最低位0)到Var<T>的转换
/// 转换逻辑:将高位部分值乘以2
impl<T: Primitive + From<i32>, H: NonZero + Into<T>> From<B0<H>> for Var<T> {#[inline(always)]fn from(_: B0<H>) -> Var<T> {let val: T = H::into(H::default());Var(val * T::from(2_i32))}
}/// 实现B1(最低位1)到Var<T>的转换
/// 转换逻辑:将高位部分值乘以2再加1
impl<T: Primitive + From<i32>, H: NonZero + Into<T>> From<B1<H>> for Var<T> {#[inline(always)]fn from(_: B1<H>) -> Var<T> {let val: T = H::into(H::default());Var(val * T::from(2_i32) + T::from(1_i32))}
}

二、代码分析

  1. 导入和基本概念
use core::convert::From;
use crate::number::{Z0, P1, N1, B0, B1, NonZero, Var, Primitive};
  • From trait 用于定义值类型之间的转换

  • Z0, P1, N1 等是自定义的类型,代表不同的数字:

    • Z0: 零

    • P1: 正一

    • N1: 负一

    • B0, B1: 二进制数字的位(0 和 1)

  • NonZero, Var, Primitive 是 trait,用于约束类型

  1. 基本数字类型转换
    代码为 Z0、P1 和 N1 实现了到各种整数和浮点类型的转换:
零的转换 (Z0)
impl From<Z0> for i8 { fn from(_: Z0) -> i8 { 0 } }
// 类似的还有 i16, i32, i64, i128, f32, f64

将 Z0 类型转换为各种数值类型时,结果都是 0

正一的转换 (P1)
impl From<P1> for i8 { fn from(_: P1) -> i8 { 1 } }
// 类似的还有 i16, i32, i64, i128, f32, f64
  • 将 P1 类型转换为各种数值类型时,结果都是 1
负一的转换 (N1)
impl From<N1> for i8 { fn from(_: N1) -> i8 { -1 } }
// 类似的还有 i16, i32, i64, i128, f32, f64
  • 将 N1 类型转换为各种数值类型时,结果都是 -1
  1. 二进制数字类型的转换
    这部分处理二进制数字(B0 和 B1)到 Var 的转换:
B0 的转换
impl<T: Primitive + From<i32>, H: NonZero + Into<T>> From<B0<H>> for Var<T> {fn from(_: B0<H>) -> Var<T> {let val: T = H::into(H::default());Var(val * T::from(2_i32))}
}
  • B0 表示一个二进制数字,最低位是 0,高位是 H

  • 转换逻辑:将高位的值乘以 2

  • 例如:如果 H 表示二进制 10(即十进制 2),那么 B0 表示 100(十进制 4)

B1 的转换
impl<T: Primitive + From<i32>, H: NonZero + Into<T>> From<B1<H>> for Var<T> {fn from(_: B1<H>) -> Var<T> {let val: T = H::into(H::default());Var(val * T::from(2_i32) + T::from(1_i32))}
}
  • B1 表示一个二进制数字,最低位是 1,高位是 H

  • 转换逻辑:将高位的值乘以 2 再加 1

  • 例如:如果 H 表示二进制 10(即十进制 2),那么 B1 表示 101(十进制 5)

  1. 关键点
  • 这是一种类型级编程技术,在编译期表示和操作数字

  • Var 是一个包装类型,用于存储运行时的实际值

  • NonZero 和 Primitive trait 用于约束类型,确保它们具有所需的特性

  • #[inline(always)] 提示编译器总是内联这些简单的转换函数

这种技术常用于需要编译期计算或类型安全的数值操作的场景,如维度检查、单位系统等。

http://www.lqws.cn/news/465769.html

相关文章:

  • springboot通过独立事务管理器实现资源隔离与精准控制​
  • HTTPS的加密方式介绍
  • MinIO社区版文件预览失效?一招解决
  • 【Fargo】mediasoup发送2:码率分配、传输基类设计及WebRtcTransport原理
  • React 组件通信
  • C++ 移动构造:提升性能的利器
  • docker执行yum报错Could not resolve host: mirrorlist.centos.org
  • Snapchat矩阵运营新策略:亚矩阵云手机打造高效社交网络
  • C++:动态链接库的编写,__declspec 用法详解
  • 7.3.2_2平衡二叉树的删除
  • 【RTP】基于mediasoup的RtpPacket的H.264打包、解包和demo 1:不含扩展
  • windows下docker虚拟文件大C盘迁移D盘
  • GPT-1 与 BERT 架构
  • TodoList 案例(Vue3): 使用Composition API
  • 基于CNN-LSTM融合模型的环卫车动态称重算法研究:从频率感知到精准质量估计
  • 深入浅出JavaScript 中的代理模式:用 Proxy 掌控对象的“行为开关”
  • Python 爬虫案例(不定期更新)
  • Occt几何内核快速入门
  • Duende Identity Server学习之一:认证服务器及一个Oidc/OAuth认证、用于Machine 2 Machine的客户端
  • 在Docker、KVM、K8S常见主要命令以及在Centos7.9中部署的关键步骤学习备存
  • stm32移植freemodbus
  • C++ - vector 的使用
  • 【转】如何画好架构图:架构思维的三大底层逻辑
  • 使用 R 处理图像
  • SQL Server基础语句2:表连接与集合操作、子查询与CET、高级查询
  • 计算机网络第九章——数据链路层《流量控制和可靠传输》
  • 为WIN10微软输入法的全角切换Bug禁用Shift+Space组合键
  • 在 MyBatis 的xml中,什么时候大于号和小于号可以不用转义
  • Nginx+Tomcat负载均衡、动静分离
  • keep-alive实现原理及Vue2/Vue3对比分析