gpt4 book ai didi

rust - lazy_static 可变变量的生命周期问题

转载 作者:行者123 更新时间:2023-11-29 08:10:06 27 4
gpt4 key购买 nike

我使用 lazy_static 在内存中保存一个 HashMap。我使用两种方法添加和获取元素,但我在生命周期方面遇到了一些问题。

这是我的代码:

#[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

最佳答案

Rust 正确地防止了此处的错误。

您的 get_val 函数正在尝试返回对 HASHMAP 的引用,但这并不安全,除非您继续持有锁,否则其他人可能会来修改脚下的 map 。

您需要保持锁定直到您返回值(通过返回互斥保护和值;例如使用 owning_ref 箱子中的 MutexGuardRef),或者复制该值返回引用:

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

有了这个实现 Foo 当然需要实现 Clone

关于rust - lazy_static 可变变量的生命周期问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41630290/

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