gpt4 book ai didi

rust - 有什么方法可以递归地使元组变平?

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

在Rust中,是否有任何方法可以使用traitimpl来(递归)展平元组?

如果有帮助,那么可以使用N个嵌套对的东西是一个好的开始

trait FlattenTuple {
fn into_flattened(self) -> /* ??? */
}

// such that
assert_eq!((1, (2, 3)).into_flattened(), (1, 2, 3))

如果可以使用任何嵌套元组扩展工作,那就更好了:
assert_eq!(((1, 2), 2, (3, (4, 5))).into_flattened(), (1, 2, 2, 3, 4, 5))

最佳答案

也许对于“扁平化”的某些小定义,但实际上并非如此。

从最具体的实现开始:

trait FlattenTuple {
fn into_flattened(self) -> (u8, u8, u8);
}

impl FlattenTuple for (u8, (u8, u8)) {
fn into_flattened(self) -> (u8, u8, u8) {
(self.0, (self.1).0, (self.1).1)
}
}

然后使其更通用:
trait FlattenTuple {
type Output;
fn into_flattened(self) -> Self::Output;
}

impl<A, B, C> FlattenTuple for (A, (B, C)) {
type Output = (A, B, C);

fn into_flattened(self) -> Self::Output {
(self.0, (self.1).0, (self.1).1)
}
}

然后对每个可能的排列重复:
impl<A, B, C, D, E, F> FlattenTuple for ((A, B), C, (D, (E, F))) {
type Output = (A, B, C, D, E, F);

fn into_flattened(self) -> Self::Output {
((self.0).0, (self.0).1, self.1, (self.2).0, ((self.2).1).0, ((self.2).1).1)
}
}

这两个实现涵盖了您的两种情况。

但是,您可能必须通过代码生成来枚举所需的每种输入类型。我没有办法“检查”输入类型,然后将其“拼接”为输出类型。

您甚至可以尝试编写一些递归的内容:
impl<A, B, C, D, E, F> FlattenTuple for (A, B)
where A: FlattenTuple<Output = (C, D)>,
B: FlattenTuple<Output = (E, F)>,
{
type Output = (C, D, E, F);

fn into_flattened(self) -> Self::Output {
let (a, b) = self;
let (c, d) = a.into_flattened();
let (e, f) = b.into_flattened();

(c, d, e, f)
}
}

但这很快就会遇到基本情况的问题:终端 42没有实现 FlattenTuple,并且如果您尝试 impl<T> FlattenTuple for T,则会遇到冲突的特征实现。

关于rust - 有什么方法可以递归地使元组变平?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63417057/

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