从元组创建数组

rap*_*2-h 5 rust

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

let a = (1, 2, 3);
let b = [a.0, a.1, a.2];
Run Code Online (Sandbox Code Playgroud)

有没有办法在不命名元组的每个元素的情况下执行此操作?就像是:

let b = a.to_array();
Run Code Online (Sandbox Code Playgroud)

Mat*_* M. 6

不存在这样的功能的时刻,但它是完全可以扩展该组的实施方式中的From特征,以覆盖此用例(和其反向).

core由于孤儿规则,此扩展必须在包中,但我们可以使用自定义特征轻松演示它:

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()] }
}
Run Code Online (Sandbox Code Playgroud)

定义后,使用起来很容易:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

将打印:

[]
[1]
[1, 2]
Run Code Online (Sandbox Code Playgroud)

反向实现会很容易,这里没有什么神秘的东西它只是样板(对宏的欢呼!).


Bal*_*Ben 6

从 1.71 开始, 和impl<T> From<(T, T)> for [T; 2]impl<T> From<[T; 2]> for (T, T)参数最多为 12。