gpt4 book ai didi

macros - 笛卡尔积匹配

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

我有两组不完整类型(即结构名称、缺少通用参数和生命周期),我需要为每对可能的组合执行一些代码:

// these are my types
struct A<T> { ... }
struct B<'a, 'b, T> { ... }
struct C { ... }

struct X<T> { ... }
struct Y { ... }
struct W<'a> { ... }
struct Z<T, D> { ... }

// this is the code I need to generate
match (first_key, second_key) {
("a", "x") => { ... A ... X ... }
("a", "y") => { ... A ... Y ... }
("a", "w") => { ... A ... W ... }
("a", "z") => { ... A ... Z ... }
("b", "x") => { ... B ... X ... }
("b", "y") => { ... B ... Y ... }
// ...
}

第一组结构(ABC)和第二组结构(XYWZ)有一个通用参数相互依赖(例如,对于 ("a", "x") 的情况,将使用的实际类型是 A<X>X< A<X>::Color > )。出于这个原因,我找不到任何使用通用函数或类似函数的解决方案。

我相信这个问题可以通过宏轻松解决;像这样的东西:

macro_rules! my_code {
( $first_type:tt), $second_type:tt ) => {
// ... $first_type ... $second_type ...
}
}

product_match!( (first_key, second_key) {
{ "a" => A, "b" => B, "c" => C },
{ "x" => X, "y" => Y, "w" => W, "z" => Z }
} => my_code )

但我未能实现 product_match在已经工作了几个小时之后。我找不到任何简单的方法来嵌套重复;我认为唯一的解决方案是使用宏将匹配案例列表转换为嵌套的值元组,然后对它们进行递归,但我发现这很难实现。

另一种选择是生成那个大 match 的代码使用构建脚本,但这个解决方案听起来很脏。

对于我错过的这个问题,是否有任何简单的解决方案?有什么简单的方法可以实现 product_match! ?如何实现我的逻辑?

最佳答案

我认为您使用宏实现笛卡尔积的想法是最好的。

我不太确定您希望 match 表达式是什么,所以我有 implemented而是重复的函数调用。然而,宏管道应该大同小异。希望你能从这里开始。

macro_rules! cp_inner {
($f: expr, $x: expr, [$($y: expr),*]) => {
$($f($x, $y);)*
}
}

macro_rules! cartesian_product {
($f: expr, [$($x: expr),*], $ys: tt) => {
$(cp_inner!($f, $x, $ys);)*;
}
}

fn print_pair(x: u32, y: &'static str) {
println!("({}, {})", x, y);
}

pub fn main() {
cartesian_product!(print_pair, [1, 2, 3], ["apple", "banana", "cherry"]);
}

关于macros - 笛卡尔积匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42767999/

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