gpt4 book ai didi

macros - 如何匹配宏中的路径或 tt?

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

我正在构建一个我认为是 Rust 中相当简单的宏来接收任意参数列表(stransi_term::Style 对象)。

我的宏看起来像这样:

macro_rules! test_macro {
( $( $x: tt ),* ) => (
$(
print!("{} ", $x);
)*
println!();
)
}

作为一个最小的工作示例,我还定义了一个模块和一个函数:

mod foo {
pub fn test() -> &'static str {
"doesn't"
}
}

fn test() -> &'static str {
"doesn't"
}

该宏适用于简单的调用,例如

test_macro!("it", "works");

但是如果我尝试更复杂的东西,我会得到编译器错误:

fn test() -> &'static str {
"doesn't"
}
test_macro!("it", test(), "work");

结果

error: no rules expected the token `(`
|
24 | test_macro!("it", test(), "work");
| ^
| |
| help: missing comma here

test_macro!("it", foo::test(), "work");

结果

error: no rules expected the token `::`
|
25 | test_macro!("it", foo::test(), "work");
| ^^

Rust Playground example .

这是我第一次使用 Rust 宏,所以我可能还遗漏了其他东西。

最佳答案

我觉得你的逻辑有问题。作为mcarton noted in the comments ,您的宏应该是 ( $( $x: expr ),* ) 而不是 ( $( $x: tt ),* )。也就是说,使用表达式而不是标记树。

您使用宏打印内容的方式不适用于标记树中存在的某些可能值。我相当确定您不能调用您的宏可能允许的 print!("{}", std::os)

关于macros - 如何匹配宏中的路径或 tt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53745030/

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