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
Macros 有没有办法将match语句的主体与Rust宏匹配?_Macros_Rust - Fatal编程技术网

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"
};