错误:变量“ x”仍在此深度重复

weg*_*gry 5 macros rust

我正在尝试编写一个宏来计时各种功能执行的时间。

macro_rules! timer {
    ($( $x: expr ),+ ) => {
        let now = SystemTime::now();
        let val = $x;

        match now.elapsed() {
            Ok(elapsed) => {
                // This should include a message at some point alongside the timing
                println!("{}", elapsed.as_secs());
            }
            Err(e) => {
                println!("{:?}", e);
            }
        }
        val
    } 
}
Run Code Online (Sandbox Code Playgroud)

但是编译器抛出一个error: variable 'x' is still repeating at this depth

在另一种我在(F#)中尝试过的静态类型语言中,使用闭包是最简单的方法。在Rust中不可能有这样的通用宏吗?

DK.*_*DK. 7

最直接的问题是,当扩展只能处理一个表达式时,您要求宏解析一个或多个表达式的序列。因此,只要一个。

其次,您希望扩展产生一个表达式,但您已将它扩展为多个语句。要解决这个问题,请扩展到一个块。

修复这些给出:

macro_rules! timer {
    ($x: expr) => {
        {
            let now = SystemTime::now();
            let val = $x;

            match now.elapsed() {
                Ok(elapsed) => {
                    // This should include a message at some point alongside the timing
                    println!("{}", elapsed.as_secs());
                }
                Err(e) => {
                    println!("{:?}", e);
                }
            }
            val
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)