gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:25:34 25 4
gpt4 key购买 nike

我正在使用 Rust,为了方便起见,我想使用一个全局可变的 HashMap。然而,虽然可以使用 lazy_staticMutex 定义一个全局的、可变的 HashMap,但是对于我的 String 在我的函数中定义的变量具有与 gloabl 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 意思是“永远存在”)。几乎唯一可能的选择是静态数据(存在于二进制文件本身中,因此只要程序运行就存在)或泄漏内存(这通常不是一个好主意)。

这里你想要的是你的 map 存储字符串本身,当一个字符串从 map 中删除时,它应该被收集。那是 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 的前缀: 这意味着您出于某种原因想要命名为/的项目,但您不想使用它(不会警告以 _ 为前缀的未使用的绑定(bind))。在这里它被积极使用,所以不应该加前缀。

关于rust - 如何将 String 变量插入全局可变 HashMap(使用 lazy_static 和 Mutex)而不会导致 "does not live long enough"问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65698038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com