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

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

一、macros.rs源码

rust 复制代码
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),\* \] ,是一个可变长度的标识符列表,表示向量中的字段名称。这里的\*表示这是一个重复的模式,可以匹配零个或多个字段。

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库中向量类型的相互转换实现,从而减少了重复代码并提高了代码的可维护性。

复制代码
相关推荐
Source.Liu2 小时前
【学Rust写CAD】20 平铺模式结构体(spread.rs)
rust·cad
Source.Liu1 天前
【学Rust写CAD】19 颜色渐变定义(gradient_stop.rs)
rust·cad
Source.Liu2 天前
【学Rust写CAD】15 定点数实现(fixed.rs)
rust·cad
Source.Liu2 天前
【学Rust写CAD】18 定点数2D仿射变换矩阵结构体(MatrixFixedPoint结构别名)
矩阵·rust·cad
Source.Liu3 天前
【学Rust写CAD】13 图像结构体(Image.rs)
rust·cad
Source.Liu3 天前
【学Rust写CAD】16 零标记类型(zero.rs)
rust·cad
Source.Liu5 天前
【学Rust写CAD】14线性插值函数(加入color.rs)
rust·cad
cuicuiniu5217 天前
如何通过CAD坐标找点?
cad·cad看图·cad看图软件
Source.Liu20 天前
【学写LibreCAD】 2.1 pdf_print_loop文件
qt·rust·pdf·cad·dxf
Source.Liu2 个月前
【Raqote】 0 Rust 2D图形库Raqote概览
rust·cad·2d