该项目的全局 HashMap 的生命周期,由 Rust 中的 lazy_static

The item's lifetime of global HashMap by lazy_static in Rust

提问人:Bingzheng Wu 提问时间:8/28/2021 更新时间:8/29/2021 访问量:481

问:

我是 Rust 的新手。

我定义了一个全局 HashMap。Userlazy_static

中有一个生命周期,所以我必须在 中设置一个生命周期。似乎只能用于.Userlazy_static'staticlazy_static

问题来了:我现在可以在 HashMap 中插入“非静态”用户吗?

下面是代码,它插入了一个非静态用户:

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

struct User<'a> {
    name: &'a str,
    score: f32,
}

lazy_static! {
    static ref USERS: Mutex<HashMap<u64, User<'static>>> = Mutex::new(HashMap::new());
}

fn new_user(id: u64, name: &str, score: f32) {
    let user = User { name, score };
    USERS.lock().unwrap().insert(id, user);
}
fn remove_user(id: u64) {
    USERS.lock().unwrap().remove(&id);
}

fn main() {
    new_user(1, "hello", 1.2);
    remove_user(1);
}

这是错误:

error[E0621]: explicit lifetime required in the type of `name`
  --> src/main.rs:16:38
   |
16 |     USERS.lock().unwrap().insert(id, user);
   |                                      ^^^^ lifetime `'static` required

静态的 辈子 惰性静态

评论

4赞 user4815162342 8/28/2021
你不能 - 因为对象在程序结束之前保持活动状态,接受任何生存期,否则将允许存储值中的引用(例如在类型的情况下)在哈希映射中无效。结构体应保存 owned,而不是 .lazy_static'staticnameUserUserString&str
0赞 Bingzheng Wu 8/28/2021
谢谢。我可以将名称更改为 ,但 中会有其他引用,例如 。它不能容纳一切。StringUser&Class
0赞 Bingzheng Wu 8/28/2021
我应该用替换吗?Arc<Class>&Class
0赞 user4815162342 8/28/2021
或者只是,取决于用例。Class
0赞 Stargateur 8/28/2021
我怀疑在您的案例中使用懒惰的静态是否有意义。我们这里有 XY 问题

答:

-1赞 Kartheek Tammana 8/28/2021 #1

如果你必须在每个 中有一个 s 列表,并且每个 s 都有一个唯一的 ,只需将 s 存储在 的每个实例中(以及你可能会引用 a 的其他任何地方)。 是,所以一切正常。UserClassUserididClassUseru64Clone