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

7 与mint库对象互转宏(macros.rs)

macros.rs代码定义了一个Rust宏mint_vec,它用于在启用mint特性时,为特定的向量类型实现与mint库中对应类型的相互转换。mint库是一个提供基本数学类型(如点、向量、矩阵等)的Rust库,旨在与多个图形和数学库兼容。这个宏通过减少重复代码,使得为自定义向量类型添加与mint库中类型的转换变得更加方便。

一、macros.rs源码

macro_rules! mint_vec {
    ($name:ident [ $($field:ident),* ] = $std_name:ident) => {
        #[cfg(feature = "mint")]
        impl<T, U> From<mint::$std_name<T>> for $name<T, U> {
            fn from(v: mint::$std_name<T>) -> Self {
                $name {
                    $( $field: v.$field, )*
                    _unit: PhantomData,
                }
            }
        }
        #[cfg(feature = "mint")]
        impl<T, U> From<$name<T, U>> for mint::$std_name<T> {
            fn from(v: $name<T, U>) -> Self {
                mint::$std_name {
                    $( $field: v.$field, )*
                }
            }
        }
    }
}

二、宏定义

1、宏定义签名:

macro_rules! mint_vec { … }定义了一个名为mint_vec的宏。

2、宏输入参数:

($name:ident [ ( ( (field:ident),* ] = $std_name:ident)是宏的参数列表。这里:

  • name:ident是一个标识符(ident),表示要生成实现的自定义向量类型的名称。
  • [ ( ( (field:ident),* ] ,是一个可变长度的标识符列表,表示向量中的字段名称。这里的*表示这是一个重复的模式,可以匹配零个或多个字段。
  • std_name:ident是另一个标识符,表示mint库中对应的标准向量类型的名称。

3、宏体

宏的主体包含了两部分impl块,分别用于实现From转换。

  • 第一部分实现了从mint库中的向量类型(mint::std_name)到自定义向量类型(name<T, U>)的转换。
  • 第二部分实现了反向的转换,即从自定义向量类型(name<T, U>)到mint库中的向量类型(mint::std_name)的转换。
  • 在这两个实现中,field: v.是宏的重复语法,用于将自定义向量类型的每个字段映射到mint库向量类型的对应字段上。这使得转换能够直接复制字段值,而不需要手动编写每个字段的转换代码。

三、条件编译

  • #[cfg(feature = “mint”)]:这个属性指示编译器仅当启用了mint特性时才编译接下来的代码块。这允许用户通过Cargo的特性标志来控制是否包含这些实现。

四、PhantomData: - _unit: PhantomData:

这是一个类型参数U的PhantomData实例,用于在自定义向量类型中携带一个额外的类型参数而不占用实际空间。这通常用于标记或限制泛型类型的用途,而在这个宏中,它可能用于保持与mint库中类型一致的泛型签名。

五、 总结

这个宏允许开发者通过简单地指定自定义向量类型的名称、字段和对应的mint库类型,来自动生成与mint库中向量类型的相互转换实现,从而减少了重复代码并提高了代码的可维护性。



http://www.kler.cn/a/529060.html

相关文章:

  • BW AO/工作簿权限配置
  • 浅析DDOS攻击及防御策略
  • 软件工程经济学-日常作业+大作业
  • 【题解】AtCoder Beginner Contest ABC391 D Gravity
  • BurpSuite抓包与HTTP基础
  • MATLAB中extractAfter函数用法
  • 快速提升网站收录:利用网站分析工具
  • 比较热门的嵌入式项目
  • Maya软件安装步骤与百度网盘链接
  • ArkTS高性能编程实践
  • Linux进程控制:【进程创建】【进程终止】【进程等待】【进程程序替换】【自主shell命令行解释器】
  • Android 音视频编解码 -- MediaCodec
  • 自动化测试框架搭建-封装requests-优化
  • 42【语言的编码架构】
  • 记5(一元逻辑回归+线性分类器+多元逻辑回归
  • 计算机视觉和图像处理
  • FPGA|安装USB Blaster驱动
  • 5 个开源且免费的提示词管理系统,按照 从优到劣 排序
  • OFDM系统仿真
  • 告别复杂,拥抱简洁:用plusDays(7)代替plus(7, ChronoUnit.DAYS)
  • 页表(Page Table)
  • 面向npm的实时仪表板Dashly
  • 红黑树介绍
  • 搜索旋转排序数组(二分查找)
  • cf集合***
  • NTU:多模态大模型的知识获取能力评估