Rust &引用;令牌“”不应包含任何规则<`&引用;将类型作为标识符传递给宏规则时
玩具示例:Rust &引用;令牌“”不应包含任何规则<`&引用;将类型作为标识符传递给宏规则时,rust,Rust,玩具示例: macro_rules! boo { ($T:ident) => { let x: $T; }; } fn main() { boo!(i32); // WORKS boo!(Option<i32>); // PROBLEM } macro\u规则!嘘声{ ($T:ident)=>{ 设x:$T; }; } fn main(){ boo!(i32);//有效 boo!(选项);//问题 } boo
macro_rules! boo {
($T:ident) => {
let x: $T;
};
}
fn main() {
boo!(i32); // WORKS
boo!(Option<i32>); // PROBLEM
}
macro\u规则!嘘声{
($T:ident)=>{
设x:$T;
};
}
fn main(){
boo!(i32);//有效
boo!(选项);//问题
}
boo!(可选)代码>导致错误:
错误:没有规则需要标记`src/main.rs:9:16
|
9 |嘘!(可选);
| ^
我可以通过以下方式解决此问题:
type Opti32 = Option<i32>;
boo!(Opti32);
type Opti32=Option;
喝倒采(32);
但是,为每次使用宏添加别名太无聊了。
可以使用像boo!(可选)代码>和隐藏
宏规则中的难度
?$T:ident
只能与标识符匹配
如果希望$T
匹配任何类型,即使它不是单个标识符,也应使用$T:ty
:
macro_rules! boo {
($T:ty) => {
let x: $T;
}
}
ident
和ty
被称为“片段说明符”,因为它们指定元变量$T
可以匹配的代码片段类型。铁锈书的第一版有,包括可能的碎片说明符列表;在编写宏之前,您一定要熟悉本章的内容