gpt4 book ai didi

rust - Rust的lazy_static暗示无法删除对象吗?

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

Rust的lazy_static crate使我们能够在Rust中创建静态对象:

lazy_static! {
static ref HASHMAP: HashMap<u32, &'static str> = {
let mut m = HashMap::new();
m.insert(0, "foo");
m.insert(1, "bar");
m.insert(2, "baz");
m
};
}

但是如您所见, HashMap也必须存储静态字符串。这是否意味着每次我向此哈希表添加某些内容时,由于它是静态的,因此永远无法将其删除吗?

最佳答案

您可以使用&'static str引用的任何字符串都必须存在,直到程序终止。因此,是的,按照设置的方式,您将永远无法删除放入HashMap中的任何字符串数据。而且,在lazy_static块之外,您也永远无法向HashMap添加任何内容。这是因为在lazy_static块之外,您将只能获得对HashMap的共享引用,并且无法对仅具有共享引用(即HashMap)的&HashMap执行变异。

如果您希望能够修改HashMap,可以通过将其包装在Mutex中并使用拥有的字符串而不是&'static str来进行修改:

#[macro_use]
extern crate lazy_static;

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

lazy_static! {
static ref HASHMAP: Mutex<HashMap<u32, String>> = {
let mut m = HashMap::new();
m.insert(0, "foo".to_string());
m.insert(1, "bar".to_string());
m.insert(2, "baz".to_string());
Mutex::new(m)
};
}

fn main() {
println!("{:?}", HASHMAP.lock().unwrap().iter());
HASHMAP.lock().unwrap().remove(&1);
println!("{:?}", HASHMAP.lock().unwrap().iter());
}

这给出了类似的输出:
[(0, "foo"), (1, "bar"), (2, "baz")]
[(0, "foo"), (2, "baz")]

但是,可能值得一问的是,静态对象是否真的是您所需要的。在Rust中,通常使用局部变量而不是静态变量是更惯用的(并且更简单,性能更好)。

关于rust - Rust的lazy_static暗示无法删除对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62463326/

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