#ghost #phantom #macro

ghost-lite

自定义 PhantomData 类型

3 个版本

0.1.2 2023 年 1 月 13 日
0.1.1 2023 年 1 月 13 日
0.1.0 2023 年 1 月 13 日

1073Rust 模式

每月 28 次下载
bg 中使用

MIT 许可证

17KB
399

::ghost_lite

使用 macro_rules 的轻量级 ::ghost 实现。

用法

use ghost_lite::ghost;

ghost! {
    /// `ghost` macro defines a custom `PhantomData`,
    /// which can be used as both a type and a value.
    pub struct MyPhantomData<T>
}

fn main() {
    let _: MyPhantomData<i32> = MyPhantomData;
    let _ = MyPhantomData::<&str>;
}

注意事项

  1. derive 应在内部属性中(#![derive(...)])。仅支持以下特性。

    ghost_lite::ghost! {
        #![derive(Clone, Copy, Default, Hash, PartialOrd, Ord, PartialEq, Eq, Debug)]
        pub struct MyPhantom<T>
    }
    
    /// `String` is not copy, but `MyPhantom` is always Copy, like `PhantomData`
    fn test() -> impl Copy {
        MyPhantom::<String>
    }
    # fn main() {}
    

    外部属性中的 derive 将直接添加到生成的 enum,这与正常的 derive 宏类似。

    ghost_lite::ghost! {
        /// MyPhantom is `Clone` and `Copy` only if T is `Clone` and `Copy`
        #[derive(Clone, Copy)]
        pub struct MyPhantom<T>
    }
    
    /// `String` is not copy, so `MyPhantom` is not Copy
    fn test() -> impl Copy {
        MyPhantom::<String>
    }
    # fn main() {}
    
  2. 实现依赖于模块名称。要在同一模块中定义多个自定义 PhantomData 类型,必须使用 #![mod_value_namespace = my_phantom_data] 提供自定义模块名称。

    ghost_lite::ghost! {
        struct MyPhantomData1<T>
    }
    
    ghost_lite::ghost! {
        struct MyPhantomData2<T>
    }
    # fn main() {}
    
    ghost_lite::ghost! {
        struct MyPhantomData1<T>
    }
    
    ghost_lite::ghost! {
        #![mod_value_namespace = my_phantom_data_2]
        struct MyPhantomData2<T>
    }
    # fn main() {}
    
  3. 如果 ghost! 报错,则将移动类型泛型约束移动到 where 子句。

    由于 macro_rules 的解析限制,不支持复杂类型约束。

    例如

    ghost_lite::ghost! {
        struct MyPhantomData<T: Clone + PartialEq>
    }
    # fn main() {}
    
    ghost_lite::ghost! {
        struct MyPhantomData<T> where T: Clone + PartialEq
    }
    # fn main() {}
    
  4. 请勿添加尾随分号 ;

    ghost_lite::ghost! {
        struct MyPhantomData<T>;
    }
    # fn main() {}
    
    ghost_lite::ghost! {
        struct MyPhantomData<T>
    }
    # fn main() {}
    

无运行时依赖