gpt4 book ai didi

rust - 在Rust的 `tt`宏中了解 `macro_rules!`

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

我在理解Rust的tt宏中究竟是什么macro_rules!时遇到了麻烦。

this answer,我以为

tt will match any single token or any pair of parenthesis/brackets/braces with their content.



但是,以下示例似乎不遵循此规则:
macro_rules! foo {
(content: $content:tt) => {
mod foo {
$content
}
}
}

foo! (
content: {
pub fn main() {
println!("Hello");
}
}
);

我希望 tt{}之后的 content:中包含的所有内容匹配,并且宏调用的结果将是
mod foo {
pub fn main() {
println!("Hello");
}
}

相反,我收到以下错误消息:
error: expected item, found `{`
--> src/main.rs:10:12
|
10 | content: {
| ^ expected item

这是怎么了另外,当我告诉Rust期望一个 item时,为什么Rust告诉我它期望一个 tt呢?

最佳答案

tt在这里按预期工作。您的宏调用如下:

foo! (
content: {
pub fn main() {
println!("Hello");
}
}
);
$content是这样的:

{
pub fn main() {
println!("Hello");
}
}

因此,结果是这样的:

mod foo {
{ // <-- Error occurs here
pub fn main() {
println!("Hello");
}
}
}

您不能在 mod声明内直接使用另一组花括号。

使您的代码正常工作的解决方案是将 $content直接放在 mod foo之后,但我想您已经看到了:
macro_rules! foo {
(content: $content:tt) => {
mod foo $content
}
}

foo! (
content: {
pub fn main() {
println!("Hello");
}
}
);

Playground

关于rust - 在Rust的 `tt`宏中了解 `macro_rules!`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60907462/

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