玩具示例:
macro_rules! boo {
($T:ident) => {
let x: $T;
};
}
fn main() {
boo!(i32); // WORKS
boo!(Option<i32>); // PROBLEM
}
boo!(Option<i32>);
导致错误:
error: no rules expected the token `<`
--> src/main.rs:9:16
|
9 | boo!(Option<i32>);
| ^
我可以解决这个问题:
type Opti32 = Option<i32>;
boo!(Opti32);
但为每次使用宏添加一个别名太无聊了。
是否可以使用boo!(Option<i32>);
之类的宏并隐藏
macro_rules
内的难度?
答案 0 :(得分:4)
$T:ident
只能匹配ident
ifier。
如果您希望$T
匹配任何类型,即使它不是单一标识符,您也应该使用$T:ty
代替:
macro_rules! boo {
($T:ty) => {
let x: $T;
}
}
ident
和ty
被称为“片段说明符”,因为它们指定了元变量$T
可以匹配的代码片段类型。 Rust书的第一版有a chapter on macros,包括可能的片段说明符列表;在尝试编写宏之前,你应该完全熟悉本章的内容。