Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何使用宏规则在匹配臂上动态设置属性_Rust_Rust Macros - Fatal编程技术网

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
。如果这能解决问题,我会看一看并更新注释。另外,如果我能找到一个涉及调用另一个宏的解决方案,这样我可以更自由地修改它,我也会非常喜欢。