如何将字符串变量插入全局可变 HashMap(使用 lazy_static 和 Mutex)而不会导致 "does not live long enough" 问题?

How to insert a String variable to a global mutable HashMap(using lazy_static and Mutex) without causing "does not live long enough" problem?

我正在使用 Rust,为了方便起见,我想使用全局可变 HashMap。然而,虽然可以使用 lazy_staticMutex 定义一个全局的、可变的 HashMap,但我在函数中定义的 String 变量很难具有相同的寿命全球时间 HashMap.

我试过直接插入一个&str,效果很好。有什么方法可以将字符串转换为纯值吗?

lazy_static! {
    static ref USER_TOKEN_HASHMAP: Mutex<HashMap<&'static str, &'static str>> = {
        let mut m = HashMap::new();
        Mutex::new(m)
    };
}

fn func() {
    let mut _map = USER_TOKEN_HASHMAP.lock().unwrap();
    let user_email = String::from("aaa");
    let user_password = String::from("bbb");
    _map.insert(user_email.as_str(), user_password.as_str());
}

错误信息:

`user_email` does not live long enough
values in a scope are dropped in the opposite order they are defined
rustc(E0597)

I've tried insert a &str directly and it worked well. Is there any way to convert a String to pure value?

这里的问题是你以错误的方式解决问题:&'static str 基本上只适用于文字,因为它意味着“指向位于其他地方但从未被收集的字符串的指针”('static 意思是“永远活着”)。几乎唯一可能的选择是静态数据(存在于二进制文件本身中,因此只要程序运行就存在)或泄漏内存(这通常不是一个好主意)。

这里你想要的是你的地图存储字符串本身,当一个字符串从地图中删除时,它应该被收集。那是 String。这就是它的作用,这就是它的用途。也许 Cow<'static, str> 在混合了静态数据和动态分配数据的奇怪情况下,但这里似乎不是这种情况。

因此修复是:

lazy_static! {
    static ref USER_TOKEN_HASHMAP: Mutex<HashMap<String, String>> = Mutex::new(HashMap::new());
}

fn func() {
    let mut _map = USER_TOKEN_HASHMAP.lock().unwrap();
    let user_email = String::from("aaa");
    let user_password = String::from("bbb");
    _map.insert(user_email, user_password);
}

顺便说一下,我建议不要使用 _map_ 前缀:这意味着您出于某种原因想要命名为 / 的项目,但您不想使用它(未使用的绑定前缀_ 不会被警告)。在这里它被积极使用,所以它不应该作为前缀。