我开始使用 Rust 宏,我来尝试这个小练习示例。我想定义一个宏,该宏扩展为类型i32
(例如,但不是很重要)的变量初始化(名称无关紧要)和对该变量的一系列操作,在这种情况下为 avar += 1
或 avar -= 1
最后它将调用println!("{}", var)
. 该宏将采用一系列基于+
和-
匹配上述操作的标记。
例如:
operate_integer![+++---]
将扩展为:
let mut var: i32 = 0;
var += 1;
var += 1;
var += 1;
var -= 1;
var -= 1;
var -= 1;
print!("{}", var);
我决定为此使用 2 个宏,一个用于包装初始化和打印,另一个用于评估+-
令牌:
基础是:
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
我有点卡住了。我知道自从我刚开始以来我可能会遗漏很多概念,我真的很感激能帮助我理解如何使用宏。先感谢您!