{ let x: $T; }; } fn main() { boo!(i32); -6ren">
gpt4 book ai didi

rust - "no rules expected the token ` < `"将类型作为标识传递给 macro_rules

转载 作者:行者123 更新时间:2023-11-29 08:12:19 27 4
gpt4 key购买 nike

玩具示例:

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

最佳答案

$T:ident 只能匹配一个identifier。

如果您希望 $T 匹配任何类型,即使它不是单个标识符,您也应该使用 $T:ty :

macro_rules! boo {
($T:ty) => {
let x: $T;
}
}

identty 被称为“片段说明符”,因为它们指定元变量 $T 可以匹配什么样的代码片段。 Rust 书的第一版有 a chapter on macros ,包括可能的片段说明符列表;在尝试编写宏之前,您一定要熟悉本章的内容。

关于rust - "no rules expected the token ` < `"将类型作为标识传递给 macro_rules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50107375/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com