有没有一种简单的方法可以一次投射整个标量值元组?

Adr*_*ian 3 rust

我想将 a 转换(u16, u16)为 a (f32, f32)。这是我尝试过的:

let tuple1 = (5u16, 8u16);
let tuple2 = tuple1 as (f32, f32);
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想避免写作

let tuple2 = (tuple1.0 as f32, tuple1.1 as f32);
Run Code Online (Sandbox Code Playgroud)

huo*_*uon 7

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

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

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

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