Macros 有没有办法将match语句的主体与Rust宏匹配?
我有这样的想法:Macros 有没有办法将match语句的主体与Rust宏匹配?,macros,rust,Macros,Rust,我有这样的想法: macro_rules! mymatch { ($obj:ident, ($matcher:tt => $result:tt),*) => { match $obj { $matcher }, } } mymatch! { x, 10 => "Ten", n if n < 5 => "Less than 5" } macro\u规则!我的对手{ ($obj:i
macro_rules! mymatch {
($obj:ident, ($matcher:tt => $result:tt),*) => {
match $obj {
$matcher
},
}
}
mymatch! {
x,
10 => "Ten",
n if n < 5 => "Less than 5"
}
macro\u规则!我的对手{
($obj:ident,($matcher:tt=>$result:tt),*)=>{
匹配$obj{
$matcher
},
}
}
我的对手!{
x,,
10=>“十”,
n如果n<5=>“小于5”
}
我不想重新实现match
语句,但我确实想在两侧添加额外的内容。然而,我不知道如何匹配
匹配语句的内容。您的语法有一些错误。如果要匹配重复模式,则需要使用
$
开始分组,如下所示:$($matcher:tt=>$result:tt),*
接下来,您可能需要匹配多个标识符,因为任何表达式都可以有效匹配,所以将其更改为
expr
。在=>
的左侧,您需要的是pat
(模式),而不是tt
。令牌树是通用的,但例如,在n if n<5
中将匹配5个单独的令牌-n
,if
,n
,中,我并没有尝试匹配match
语句。如果必须的话,我不介意使用专门的语法,但我真的不想用语法替换匹配的matcher=>result
部分。啊,好的。我误解了。这是一个匹配的东西,我要放回相同的顺序很多!啊,好吧,我以前在rust宏中见过这种情况。非常感谢!请注意,这不是Rust的match
语句的1对1映射。这需要在块后面加逗号(match x{None=>{}\u=>()}
无效),并且不允许后面加逗号
my_match! {
x,
10 => "Ten",
_ => "something else"
}
macro_rules! my_match {
($obj:expr, $($matcher:pat => $result:expr),*) => {
match $obj {
$($matcher => $result),*
}
}
}
macro_rules! my_match {
($obj:expr, $($matcher:pat $(if $pred:expr)* => $result:expr),*) => {
match $obj {
$($matcher $(if $pred)* => $result),*
}
}
}
let x = 7;
let s = my_match! {
x,
10 => "Ten",
n if x < 5 => "Less than 5",
_ => "something else"
};
println!("s = {:?}", s); // "Something else"
my_match! {
x,
10 => "Ten",
n if x < 5 => {
println!("it was {}", n);
"Less than 5"
},
_ => "something else"
};