如何将String变量插入全局可变HashMap(使用lazy_static和Mutex)而不会导致“寿命不够长”问题?
我正在使用 Rust,HashMap为了方便起见,我想使用全局可变变量。然而,虽然可以HashMap使用lazy_staticand定义一个全局的、可变的Mutex,但String我的函数中定义的变量很难与global具有相同的生命周期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)
回答
我试过直接插入 &str 并且效果很好。有没有办法将字符串转换为纯值?
这里的问题是您以错误的方式解决问题:&'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这意味着您出于某种原因希望名为 / 的项目处于活动状态,但您不想使用它(_不会警告以 为前缀的未使用绑定)。在这里它被积极使用,所以它不应该被加前缀。
THE END
二维码