gpt4 book ai didi

macros - 宏可以将数组/向量扩展为多个索引参数吗?

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

是否可以编写一个宏将表达式扩展为多个索引参数,这些参数可以传递给函数或另一个宏?

请参阅这个简单的自包含示例。
目的是让 unpack3v 扩展为 v[0]、v[1]、 v[2].

macro_rules! elem {
($val:expr, $($var:expr), *) => {
$($val == $var) || *
}
}

// attempt to expand an array.
macro_rules! unpack3 {
($v:expr) => {
$v[0], $v[1], $v[2]
}
}

fn main() {
let a = 2;
let vars = [0, 1, 3];
// works!
if elem!(a, vars[0], vars[1], vars[2]) {
println!("Found!");
}
// fails!
if elem!(a, unpack3!(vars)) {
println!("Found!");
}
}

第二个例子失败了,有没有可能让它工作?

可能的解决方案可能包括:

  • 改变宏语法的使用。
  • 使用元组,然后扩展为参数。
  • 重新安排表达式以解决宏约束。

请注意,这可能与 Escaping commas in macro output 有关但不要认为它是重复的。

最佳答案

这在两种不同的方式下是不可能的。

首先,引用您自己链接的问题的答案:“不;宏的结果必须是一个完整的语法结构,如表达式或项。您绝对不能 具有随机的语法位,例如逗号或右大括号。”仅仅因为它不是完全逗号并没有改变问题:函数参数的集合不是一个完整的语法结构。

其次,宏不能解析其他宏的输出。这需要急切的扩展,而 Rust 没有。 You can only do this using recursion .

关于macros - 宏可以将数组/向量扩展为多个索引参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39555539/

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