是否有一种简单的方法可以同时转换整个标量值元组?

时间:2015-05-01 03:53:33

标签: rust

我想将(u16, u16)投射到(f32, f32)。这就是我试过的:

let tuple1 = (5u16, 8u16);
let tuple2 = tuple1 as (f32, f32);

理想情况下,我想避免写

let tuple2 = (tuple1.0 as f32, tuple1.1 as f32);

3 个答案:

答案 0 :(得分:4)

没有内置的方法可以做到这一点,但可以用宏来做到这一点:

macro_rules! tuple_as {
    ($t: expr, ($($ty: ident),*)) => {
        {
            let ($($ty,)*) = $t;
            ($($ty as $ty,)*) 
        }
    }
}

fn main() {
    let t: (u8, char, isize) = (97, 'a', -1);

    let other = tuple_as!(t, (char, i32, i8));

    println!("{:?}", other);
}

打印('a', 97, -1)

宏仅适用于在名称为单个标识符的类型之间进行转换(这是: ident引用的内容),因为它重用这些名称来绑定源元组的元素能够施放它们。所有原始类型都是有效的单一标识符,因此适用于那些。

答案 1 :(得分:2)

不,你不能。这大致相当于“我可以将结构中的所有字段一次性转换为不同的类型吗?”。

可以编写一个可以为您进行此转换的通用扩展特征,唯一的问题是我不相信任何现有的通用“转换”特征也具有{{1实现定义。

如果你真的想要一个能够做到这一点的函数,那么这里有一个as-minimal-as-as-make-it骨架:

u16 -> f32

答案 2 :(得分:0)

没有,        那里              是                 不