4 个版本 (重大更改)
0.4.0 | 2024年1月26日 |
---|---|
0.3.0 | 2024年1月18日 |
0.2.0 | 2024年1月4日 |
0.0.1 | 2023年12月26日 |
#1891 in 过程宏
每月下载量 33
在 7 个crate中使用 (通过 code-product)
46KB
798 行
代码产品
此crate提供两个功能
- A 库,通过重复展开宏来生成代码。这是此crate的主要目标,因为它可以从其他proc宏方便地生成代码。语法也在其中。
- 独立的
product!{}
和product_items!{}
宏,使用库生成代码,因为它本身很有用。
使用案例
此宏系统用于生成以类似方式重复的样板代码。
产品展开示例
名称 product
是因为它展开为所有定义集合的乘积(每个乘以每个)。例如,有两个定义集合 'Foo 和 Bar' 和 'This 和 That',展示了不同的语法变体
# use code_product::product;
# trait Trait<T>{}
# struct This<T>(T); struct That<T>(T);
# struct Foo; struct Bar;
product!{
// Rather elaborate form with named definitions:
// define `Type` to expand to `This` and `That`
$(Type: (This) (That))
// and inline define `T` to expand to `Foo` and `Bar`
impl Trait<$($T: (Foo)(Bar))> for $Type<$T> {}
}
或
# use code_product::product;
# trait Trait<T>{}
# struct This<T>(T); struct That<T>(T);
# struct Foo; struct Bar;
product!{
// Alternative form inlining definition and reference by index:
impl Trait<$((Foo)(Bar))> for $((This)(That))<$0> {}
}
上述任何一个都会展开四次,变为
# trait Trait<T>{}
# struct This<T>(T); struct That<T>(T);
# struct Foo; struct Bar;
impl Trait<Foo> for This<Foo> {}
impl Trait<Foo> for That<Foo> {}
impl Trait<Bar> for This<Bar> {}
impl Trait<Bar> for That<Bar> {}
线性展开示例
在 linear
扩展作用域中,方括号内每个定义必须定义相同数量的项目。然后它们一起迭代。这为展开提供了更多控制,因为必须手动定义每个可能的组合。
示例:将 Pair Substr 与 &str 和 CowStr 及其反转形式配对。
product! {
$[
$(Lhs: (SubStr)(&str)(SubStr)(CowStr))
$(Rhs: (&str)(SubStr)(CowStr)(SubStr))
impl PartialOrd<$Rhs> for $Lhs {
fn partial_cmp(&self, other: &$Rhs) -> Option<std::cmp::Ordering> {
(**self).partial_cmp(other)
}
}
]
}
依赖关系
~60KB