Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Match tuple as input to map

Tags:

rust

An attempt to pattern match a tuple within a map:

fn main() {
    let z = vec![(1, 2), (3, 4)];
    let sums = z.iter().map(|(a, b)| a + b);
    println!("{:?}", sums);
}

produces the error

error[E0308]: mismatched types
 --> src/main.rs:3:30
  |
3 |     let sums = z.iter().map(|(a, b)| a + b);
  |                              ^^^^^^ expected reference, found tuple
  |
  = note: expected type `&({integer}, {integer})`
             found type `(_, _)`

It is possible to use this syntax in some varied form, or must I write:

fn main() {
    let z = vec![(1, 2), (3, 4)];
    let sums = z.iter()
        .map(|pair| {
            let (a, b) = *pair;
            a + b
        })
        .collect::<Vec<_>>();
    println!("{:?}", sums);
}
like image 941
Synesso Avatar asked Oct 27 '16 06:10

Synesso


1 Answers

The key is in the error message:

  |
3 |     let sums = z.iter().map(|(a, b)| a + b);
  |                              ^^^^^^ expected reference, found tuple
  |

It is telling you that map accepts its argument by reference, thus you need a reference in the pattern:

fn main() {
    let z = vec![(1, 2), (3, 4)];
    let sums = z.iter().map(|&(a, b)| a + b);
    //                       ^
    println!("{:?}", sums);
}

And that's it.

like image 165
Matthieu M. Avatar answered Sep 19 '22 09:09

Matthieu M.