12

I want to insert or update a value in the map, and then get the number of keys.

 use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();
    let count = map.entry("Tom").or_insert(0);
    *count += 1;

    let size = map.keys().len();
    println!("{} men found", size);
}

The compiler error:

error[E0502]: cannot borrow `map` as immutable because it is also borrowed as mutable
  --> src/main.rs:8:16
   |
5  |     let count = map.entry("Tom").or_insert(0);
   |                 --- mutable borrow occurs here
...
8  |     let size = map.keys().len();
   |                ^^^ immutable borrow occurs here
9  |     println!("{} men found", size);
10 | }
   | - mutable borrow ends here

Is there any way to work around this? Is the way I wrote it wrong?

Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
Kenneth
  • 403
  • 4
  • 12

1 Answers1

15

Choose one of:

  1. Use Rust 2018 or another version of Rust with non-lexical lifetimes:

    use std::collections::HashMap;
    
    fn main() {
        let mut map = HashMap::new();
        let count = map.entry("Tom").or_insert(0);
        *count += 1;
    
        let size = map.keys().len();
        println!("{} men found", size);
    }
    
  2. Don't create a temporary value:

    *map.entry("Tom").or_insert(0) += 1;
    
  3. Add a block to constrain the borrow:

    {
        let count = map.entry("Tom").or_insert(0);
        *count += 1;
    }
    
Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366