rust 从元组创建数组

6ju8rftf  于 2023-10-20  发布在  其他
关注(0)|答案(3)|浏览(93)

我可以从一个元组创建一个数组,像这样:

let a = (1, 2, 3);
let b = [a.0, a.1, a.2];

有没有一种方法可以做到这一点,而不命名元组的每个元素?例如:

let b = a.to_array();
b09cbbtk

b09cbbtk1#

目前还没有这样的功能,但是扩展From trait的实现集来覆盖这个用例是完全可能的(或者相反)。
由于孤儿规则,这个扩展必须在core crate中,但是我们可以很容易地用自定义traits来演示它:

use std::convert::Into;

trait MyFrom<T> {
    fn my_from(t: T) -> Self;
}

trait MyInto<U> {
    fn my_into(self) -> U;
}

impl<T, U> MyInto<U> for T
    where
        U: MyFrom<T>
{
    fn my_into(self) -> U { <U as MyFrom<T>>::my_from(self) }
}

impl<T> MyFrom<()> for [T; 0] {
    fn my_from(_: ()) -> Self { [] }
}

impl<T, A> MyFrom<(A,)> for [T; 1]
    where
        A: Into<T>,
{
    fn my_from(t: (A,)) -> Self { [t.0.into()] }
}

impl<T, A, B> MyFrom<(A, B)> for [T; 2]
    where
        A: Into<T>,
        B: Into<T>,
{
    fn my_from(t: (A, B)) -> Self { [t.0.into(), t.1.into()] }
}

一旦定义,就很容易用途:

fn main() {
    {
        let array: [i64; 0] = ().my_into();
        println!("{:?}", array);
    }
    {
        let array: [i64; 1] = (1u32,).my_into();
        println!("{:?}", array);
    }
    {
        let array: [i64; 2] = (1u32, 2i16).my_into();
        println!("{:?}", array);
    }
}

将打印:

[]
[1]
[1, 2]

反向实现也很容易,这里没有什么神秘的,只是样板(宏万岁!).

kyvafyod

kyvafyod2#

不没有更重要的是,你甚至不能对元组进行遍历。元组是异构的,因此它不适合转换为同构类型,如向量或数组。
你可以写一个宏来允许对一个通用长度的元组的内容进行迭代并收集它们(只要它的所有元素都是相同的类型),但是你仍然需要单独访问/处理每个元素。

kuhbmx9i

kuhbmx9i3#

在1.71中,有impl<T> From<(T, T)> for [T; 2]impl<T> From<[T; 2]> for (T, T)用于12以下的示例。

相关问题