1

Depending on a variable, I would like to iterate over a BTreeMap forwards or in reverse like so (playground):

pub enum Direction {
    Forwards,
    Backwards,
}

pub fn main() {
    use std::collections::BTreeMap;

    let direction = Direction::Forwards;

    // type inference lets us omit an explicit type signature (which
    // would be `BTreeMap<&str, &str>` in this example).
    let mut movie_reviews = BTreeMap::new();

    // review some movies.
    movie_reviews.insert("Office Space", "Deals with real issues in the workplace.");
    movie_reviews.insert("Pulp Fiction", "Masterpiece.");
    movie_reviews.insert("The Godfather", "Very enjoyable.");
    movie_reviews.insert("The Blues Brothers", "Eye lyked it a lot.");

    let iter = match direction {
        Direction::Forwards => movie_reviews.iter_mut(),
        Direction::Backwards => movie_reviews.iter_mut().rev(),
    };

    for (title, desc) in iter {
        println!("{}: {}", title, desc)
    }
}

However the match doesn't have the same type and errors:

error[E0308]: `match` arms have incompatible types
  --> src/main.rs:23:33
   |
21 |       let iter = match direction {
   |  ________________-
22 | |         Direction::Forwards => movie_reviews.iter_mut(),
   | |                                ------------------------ this is found to be of type `std::collections::btree_map::IterMut<'_, &str, &str>`
23 | |         Direction::Backwards => movie_reviews.iter_mut().rev(),
   | |                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `std::collections::btree_map::IterMut`, found struct `Rev`
24 | |     };
   | |_____- `match` arms have incompatible types
   |
   = note: expected type `std::collections::btree_map::IterMut<'_, _, _>`
            found struct `Rev<std::collections::btree_map::IterMut<'_, _, _>>`

How can I dynamically decide which direction to iterate in?

Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
Dominic
  • 62,658
  • 20
  • 139
  • 163
  • Alright, I'm not using any libs except `std` - here's an example: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=8397dbb3019c0187c95262d483481cf9 – Dominic May 25 '21 at 13:54
  • 2
    [One of the duplicate suggestions applied to your situation](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=46d6759d4dd60a0f7b43381bf5db2377) – Shepmaster May 25 '21 at 14:01

0 Answers0