Rust 如何使用宏规则在匹配臂上动态设置属性
我有一个捕获属性的现有宏定义。在该定义中,我试图有选择地过滤和设置属性 我有一个特殊的问题,在这种情况下,我必须为匹配臂设置属性Rust 如何使用宏规则在匹配臂上动态设置属性,rust,rust-macros,Rust,Rust Macros,我有一个捕获属性的现有宏定义。在该定义中,我试图有选择地过滤和设置属性 我有一个特殊的问题,在这种情况下,我必须为匹配臂设置属性 macro\u规则!设置我的特征{ ( $target:ident $( $(#[$cfgs:meta])* $field:ident ),* $(,)* ) => { impl$crater::MyTrait for$target { fn执行(&self)->选项{ //在这里使用过滤逻辑 $(#[$attr])* }; } 打电话给 match self{$(
macro\u规则!设置我的特征{
(
$target:ident
$(
$(#[$cfgs:meta])*
$field:ident
),*
$(,)*
) => {
impl$crater::MyTrait for$target
{
fn执行(&self)->选项{
//在这里使用过滤逻辑
$(#[$attr])*
};
}
打电话给
match self{$(
$crate::管道属性!{$($cfgs),*}
$field=>{
//doSomething($field)
没有一个
}
)* }
问题:在这种情况下,发出属性似乎不起作用,我需要将其附加到项目()
选择2
方法:使用包含两个参数的宏。一个用于属性,另一个用于匹配臂
实施:
管道式属性
#[宏导出]
宏规则!管道属性{
(
[$($attr:tt)*]
{$rest:tt}
) => {
//在这里使用过滤逻辑
$(#[$attr])*
$rest,
};
}
拜访
match self{$(
$crater::管道运输{
[$($cfgs),*]
{$field=>{
//doSomething($field);
没有一个
}}
}
)* }
问题:我发现显然我们现在无法从属性返回匹配的“arms”
最后……问题
这些方法是否可行?如果不可行,有没有更好的方法来看待这个问题?您能详细说明一下您正在尝试筛选的属性,更重要的是在什么情况下?听起来您可能正在尝试重新实现?下面是一个简单的用例。我想让任何
#[cfg(…)]
通过但阻止#[doc]
属性。此外,我希望控制(如果可能的话)哪些cfg属性通过。例如:#[cfg(feature=…)]
应该通过,而不是#[cfg(target_os=…)]
。另外,我不知道cfg\u attr
。如果这能解决问题,我会看一看并更新注释。另外,如果我能找到一个涉及调用另一个宏的解决方案,这样我可以更自由地修改它,我也会非常喜欢。