5

我正在尝试使用 aHashMap<String, &Trait>但我有一条我不明白的错误消息。这是代码(操场):

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);
}

这是我得到的错误:

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

这里发生了什么事?有解决方法吗?

4

1 回答 1

9

这个问题已通过非词法生命周期解决,从 Rust 2018 开始不应成为问题。下面的答案与使用旧版 Rust 的人有关。


mapoutlives s,所以在map's 生命中的某个时刻(就在毁灭之前),s将是无效的。这可以通过改变它们的构造顺序来解决,从而改变它们的破坏顺序:

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

如果您希望HashMap拥有引用,请使用拥有的指针:

let mut map: HashMap<String, Box<Trait>> = HashMap::new();
let s = Struct;
map.insert("key".to_string(), Box::new(s));
于 2015-08-24T00:06:56.390 回答