我可以从一个元组创建一个数组,像这样:
let a = (1, 2, 3); let b = [a.0, a.1, a.2];
有没有一种方法可以做到这一点,而不命名元组的每个元素?例如:
let b = a.to_array();
b09cbbtk1#
目前还没有这样的功能,但是扩展From trait的实现集来覆盖这个用例是完全可能的(或者相反)。由于孤儿规则,这个扩展必须在core crate中,但是我们可以很容易地用自定义traits来演示它:
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()] } }
一旦定义,就很容易用途:
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]
反向实现也很容易,这里没有什么神秘的,只是样板(宏万岁!).
kyvafyod2#
不没有更重要的是,你甚至不能对元组进行遍历。元组是异构的,因此它不适合转换为同构类型,如向量或数组。你可以写一个宏来允许对一个通用长度的元组的内容进行迭代并收集它们(只要它的所有元素都是相同的类型),但是你仍然需要单独访问/处理每个元素。
kuhbmx9i3#
在1.71中,有impl<T> From<(T, T)> for [T; 2]和impl<T> From<[T; 2]> for (T, T)用于12以下的示例。
impl<T> From<(T, T)> for [T; 2]
impl<T> From<[T; 2]> for (T, T)
3条答案
按热度按时间b09cbbtk1#
目前还没有这样的功能,但是扩展
From
trait的实现集来覆盖这个用例是完全可能的(或者相反)。由于孤儿规则,这个扩展必须在
core
crate中,但是我们可以很容易地用自定义traits来演示它:一旦定义,就很容易用途:
将打印:
反向实现也很容易,这里没有什么神秘的,只是样板(宏万岁!).
kyvafyod2#
不没有更重要的是,你甚至不能对元组进行遍历。元组是异构的,因此它不适合转换为同构类型,如向量或数组。
你可以写一个宏来允许对一个通用长度的元组的内容进行迭代并收集它们(只要它的所有元素都是相同的类型),但是你仍然需要单独访问/处理每个元素。
kuhbmx9i3#
在1.71中,有
impl<T> From<(T, T)> for [T; 2]
和impl<T> From<[T; 2]> for (T, T)
用于12以下的示例。