Search code examples
structrusttuplestuple-struct

How can I unpack a tuple struct like I would a classic tuple?


I can unpack a classic tuple like this:

let pair = (1, true);
let (one, two) = pair;

If I have a tuple struct such as struct Matrix(f32, f32, f32, f32) and I try to unpack it, I get an error about "unexpected type":

struct Matrix(f32, f32, f32, f32);
let mat = Matrix(1.1, 1.2, 2.1, 2.2);
let (one, two, three, four) = mat;

Results in this error:

error[E0308]: mismatched types
  --> src/main.rs:47:9
   |
47 |     let (one, two, three, four) = mat;
   |
   = note: expected type `Matrix`
              found type `(_, _, _, _)`

How can I unpack a tuple struct? Do I need to convert it explicitly to a tuple type? Or do I need to hardcode it?


Solution

  • It's simple: just add the type name!

    struct Matrix(f32, f32, f32, f32);
    
    let mat = Matrix(1.1, 1.2, 2.1, 2.2);
    let Matrix(one, two, three, four) = mat;
    //  ^^^^^^
    

    This works as expected.


    It works exactly the same with normal structs. Here, you can bind either to the field name or a custom name (like height):

    struct Point {
        x: f64,
        y: f64,
    }
    
    let p = Point { x: 0.0, y: 5.0 };
    let Point { x, y: height } = p;
    
    println!("{x}, {height}");