println!("{:?}", "hello"); println!("{:?}", "there");-6ren">
gpt4 book ai didi

rust - 具有相同分隔符的并排宏重复

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

真的不能创建这样的宏还是我做错了:

sample!("hello", "there") => 

println!("{:?}", "hello");
println!("{:?}", "there");

sample!("hello", "there", a "second type", a "another second type") =>

println!("{:?}", "hello");
println!("{:?}", "there");
println!("second {:?}", "second type");
println!("second {:?}", "another second type");

我试过的是这个(playground link):

macro_rules! sample {
(
$( $first:literal ),*
$( a $second:literal ),*
) => {
$(
println!("{:?}", $first);
)*
$(
println!("second {:?}", $second);
)*
};
}

失败的原因是:

error: no rules expected the token `a`
--> main.rs:18:20
|
1 | macro_rules! sample {
| ------------------- when calling this macro
...
18 | sample!("hello", a "testing");
| ^ no rules expected this token in macro call

error: aborting due to previous error

最佳答案

Rust 宏对分隔符非常严格。

macro_rules! sample {
(
$( $first:literal, )*
$( a $second:literal ),*
) => {
$(println!("{:?}", $first);)*
$(println!("second {:?}", $second);)*
};
}

fn main() {
sample!("hello", a "testing");
}

此示例有效,您能发现其中的变化吗?我将逗号从第一个 $( ... ) 外部移到内部。区别在于:

  • $( $a:literal ),* 只接受 "a", "b", "c" (不允许尾随逗号)
  • $( $a:literal, )* 仅接受 "a", "b", "c", (需要尾随逗号)

在您的宏中,中间逗号不匹配作为第一次或第二次重复的一部分。该错误基本上是说它期望另一个 $first 而不是 $second 因为这就是重复所说的。

您可以通过引入可选的逗号来修复它:

macro_rules! sample {
(
$( $first:literal ),*
$(,)? // <----------------
$( a $second:literal ),*
) => {
$(println!("{:?}", $first);)*
$(println!("second {:?}", $second);)*
};
}

这更宽松,但会允许这样奇怪的事情,这可能会也可能不会,这取决于你想要什么。

sample!("hello", "there",);
sample!(, a "testing");
sample!("hello" a "testing");

不幸的是,如果不使用不同的 ARM ,我不知道一个完美的解决方案:

macro_rules! sample {
($( $first:literal ),*) => { };
($( $first:literal, )* $( a $second:literal ),+) => { };
($( a $second:literal ),*) => { };
}

fn main() {
sample!("hello", "there");
sample!("hello", "there", a "testing");
sample!(a "second type", a "another second type");
// sample!("hello", "there",);
// sample!(, a "testing");
// sample!("hello" a "testing");
}

另见:

关于rust - 具有相同分隔符的并排宏重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66432008/

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