使用lazy_static可变变量的生命周期问题

时间:2017-01-13 08:29:45

标签: rust lifetime

我使用lazy_staticHashMap保留在内存中。我使用两种方法添加和获取元素,但是我在生命中遇到了一些问题。

这是我的代码:

#[macro_use]
extern crate lazy_static;

use std::sync::Mutex;
use std::collections::HashMap;

lazy_static! {
    static ref HASHMAP: Mutex<HashMap<String, Foo>> = Mutex::new({
        let mut m = HashMap::new();
        m.insert("one".to_string(), Foo{param1:"foo1".to_string(),    param2:"foo2".to_string()} );
        m.insert("two".to_string(), Foo{param1:"bar1".to_string(), param2:"bar2".to_string()});
        m
    });
}

pub struct Foo{
    param1: String,
    param2: String,
}

pub fn ins_val(name: String, f: Foo){
    HASHMAP.lock().unwrap().insert(name, f);
}

pub fn get_val(k: &str) -> Option<&Foo>{
    HASHMAP.lock().unwrap().get(k)
}

这就是错误:

HASHMAP.lock().unwrap().get(k) 
^^^^^^^^^^^^^^^^^^^^^^^
reference must be valid for the anonymous lifetime #1 defined on the block

1 个答案:

答案 0 :(得分:10)

Rust正确地防止了这里的错误。

您的get_val函数正在尝试将引用返回HASHMAP,但这不安全,除非您继续按住锁定,否则其他人可能会来修改您脚下的地图。

你需要保持锁定,直到你返回值(通过返回互斥锁和值;例如使用owning_ref包中的MutexGuardRef),或者复制值而不是返回参考:

pub fn get_val(k: &str) -> Option<Foo> {
    HASHMAP.lock().unwrap().get(k).cloned()
}

通过此实施,Foo当然需要实施Clone