HashMap key does not live long enough

99封情书 提交于 2019-12-23 10:06:32

问题


I'm trying to use a HashMap<String, &Trait> but I have an error message I don't understand. Here's the code (playground):

use std::collections::HashMap;

trait Trait {}

struct Struct;

impl Trait for Struct {}

fn main() {
    let mut map: HashMap<String, &Trait> = HashMap::new();
    let s = Struct;
    map.insert("key".to_string(), &s);
}

Here's the error I'm getting:

error[E0597]: `s` does not live long enough
  --> src/main.rs:12:36
   |
12 |     map.insert("key".to_string(), &s);
   |                                    ^ borrowed value does not live long enough
13 | }
   | - `s` dropped here while still borrowed
   |
   = note: values in a scope are dropped in the opposite order they are created

What's happening here? Is there a workaround?


回答1:


This issue was solved with non-lexical lifetimes, and should not be a concern from Rust 2018 onwards. The answer below is relevant for people using older versions of Rust.


map outlives s, so at some point in map's life (just before destruction), s will be invalid. This is solvable by switching their order of construction, and thus of destruction:

let s = Struct;
let mut map: HashMap<String, &Trait> = HashMap::new();
map.insert("key".to_string(), &s);

If you instead want the HashMap to own the references, use owned pointers:

let mut map: HashMap<String, Box<Trait>> = HashMap::new();
let s = Struct;
map.insert("key".to_string(), Box::new(s));


来源:https://stackoverflow.com/questions/32172780/hashmap-key-does-not-live-long-enough

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!