var += 1
或var -= 1
,最后会调用println!("{}", var)
。该宏将基于
+
和-
匹配上述操作的一系列标记。例如:
operate_integer![+++---]
应该扩展为:
let mut var: i32 = 0;
var += 1;
var += 1;
var += 1;
var -= 1;
var -= 1;
var -= 1;
print!("{}", var);
我将使用两个宏来完成此操作,一个用于包装初始化和打印,另一个用于评估
+-
标记:基本宏如下:
macro_rules! operate_integer {
// $($all_tokens:tt)* should match everything, it will be forward to the helper macro
($($all_tokens:tt)*) => {
let mut var : i32 = 0;
operate_integer_helper![$($all_tokens:tt)*]
print!("{}", var);
}
}
辅助程序将扩展操作:
macro_rules! operate_integer_helper {
// the idea is that it matches a `+` followed by more tokens
(+$($t:tt)*) => {
val += 1;
operate_integer_helper![$($t:tt)*] // we recursively handle the remaining tokens
}
(-$($t:tt)*) => {
val -= 1;
operate_integer_helper![$($t:tt)*]
}
}
当然,这并不起作用,它会因以下错误而编译失败(Playground):
error: no rules expected the token `(`
--> src/lib.rs:102:5
|
102 | (+$($t:tt)*) => {
| ^ no rules expected this token in macro call
我有些困惑。由于我刚开始接触,可能会错过许多概念,因此我真的很希望能够获得一些帮助,了解如何使用宏。
提前感谢您!