我正在尝试编写一个宏来计时各种功能执行的时间。
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中不可能有这样的通用宏吗?
最直接的问题是,当扩展只能处理一个表达式时,您要求宏解析一个或多个表达式的序列。因此,只要问一个。
其次,您希望扩展产生一个表达式,但您已将它扩展为多个语句。要解决这个问题,请扩展到一个块。
修复这些给出:
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)