gpt4 book ai didi

rust - 变量仍在重复宏中的这个深度错误

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

我写了一个简单的宏:

macro_rules! my_macro {
{
f($x:expr, $y:expr, $z:expr);
$($c:expr => {
$($m:expr => {
$($s:expr => $b:expr),+
}),+
}),+
} => {{
match ($x, $y, $z) {
$(
($c, $m, $s => $b),
)+
}
}};
}

fn main(){

let c = 0;
let m = 0;
let s = 0;
my_macro! {
f (c, m, s);
cc => {
mm => {
ss => b
}
}
}

}

它得到编译器错误:

error: variable 'm' is still repeating at this depth
--> project/src/mod.rs
|
39 | ($c, $m, $s => $b),
| ^^^^^^^

我不完全明白为什么会这样。为什么以及如何修复它?

最佳答案

在您的宏规则中,

f($x:expr, $y:expr, $z:expr);
$($c:expr => {
$($m:expr => {
$($s:expr => $b:expr),+
}),+
}),+

$x$y$z 绑定(bind)单个 expr。但是,绑定(bind)了整个 $c 列表。此外,与每个 $c 关联的是一个完整的 $m 列表,因为 $m 仍在 $(... ).+ block 与 $c 关联。对于其中的每一个 $m,都会绑定(bind)一个完整的 $s 列表。

现在在你的输出中,

{{
match ($x, $y, $z) {
$(
($c, $m, $s => $b),
)+
}
}};

你只用 $(...)+ 解压一层列表。一层之后,$m仍然是一个表达式列表(“重复”),所以不能直接使用。请记住,$m 实际上是一个列表列表(因为每个 $c 都有一个 $m 列表)和 $s 实际上是一个列表列表的列表。

您要么需要重组规则,以便每个 $c 只有一个 $m 和一个 $s (都在一个 $(...),+ 中)或者您将需要重组输出,以便 $m$s 解压适当次数。

在尝试第一种方法(输入规则中的单个 $(...),+ 之后),我建议制作 $c, $m$s 模式而不是表达式(如 $c: pat 而不是 $c: expr)。这允许它们在匹配分支的左侧使用。

macro_rules! my_macro {
{
f($x:expr, $y:expr, $z:expr);
$($c:pat => {
$m:pat => {
$s:pat => $b:expr
}
}),+
} => {
match ($x, $y, $z) {
$(
($c, $m, $s) => $b,
)+
}
};
}

真正的解决方案在很大程度上取决于您究竟想要完成什么。

关于rust - 变量仍在重复宏中的这个深度错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56573793/

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