【发布时间】:2017-03-13 15:54:08
【问题描述】:
我有两组 不完整 类型(即结构名称、缺少泛型参数和生命周期),我需要为每对可能的组合执行一些代码:
// 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 ... }
// ...
}
第一组的结构(A、B、C)和第二组的结构(X、Y、W、Z)有一个通用参数相互依赖(例如,对于 ("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!?如何实现我的逻辑?
【问题讨论】:
-
哎呀,看起来很痛苦:(祝你好运。
-
我相信这个问题可以通过宏轻松解决——宏不会给 Rust 的功能添加任何真正的魔力,它们只是删除了样板。但是,您还没有向我们展示样板。相反,您已经用
...忽略了问题的实质。我很确定您不希望我们创建一个扩展为文字...的宏,但我们不知道它应该是什么。请查看如何创建minimal reproducible example。我将首先提供 2 组 2 种类型的完整定义和match的完整所需代码。你可能会从中得到一些有用的东西。 -
@Shepmaster by
... A ... X ...我的意思是f(A, X),我认为这是一个最小的、完整的和可验证的例子。在我的特定情况下,我需要创建一个通道来传输与$first实现的特征关联的类型,然后启动一个线程,在其中实例化$second并将其传递给函数(f1),然后调用函数(f2) 在主线程上的$first。f2要求$first实现一个 trait,其泛型参数必须是与$second和f1的 trait 实现的关联类型,而f1需要$second。 -
我想我们不同意 verifiable 的含义,因为我无法用您提供的代码验证 anything 并且根据我目前的理解,无论是否使用宏,都不可能编写您要求的代码。如果您 edit 您的问题要显示
A、B和Z的完整定义,match对a, z、b, z和您从宏调用的函数签名,那么也许我们可以看到样板,然后构造宏。
标签: macros nested rust match repeat