3 个版本
0.1.2 | 2023 年 1 月 13 日 |
---|---|
0.1.1 | 2023 年 1 月 13 日 |
0.1.0 | 2023 年 1 月 13 日 |
1073 在 Rust 模式
每月 28 次下载
在 bg 中使用
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>;
}
注意事项
-
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() {}
-
实现依赖于模块名称。要在同一模块中定义多个自定义 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() {}
-
如果
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() {}
-
请勿添加尾随分号
;
。ghost_lite::ghost! { struct MyPhantomData<T>; } # fn main() {}
ghost_lite::ghost! { struct MyPhantomData<T> } # fn main() {}