Любая строка, на которую вы можете ссылаться с помощью &'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")]
Однако, возможно, стоит спросить, действительно ли объект stati c является тем, что вам нужно. В Rust обычно более идиоматично c (и проще и эффективнее) использовать локальные переменные вместо статики.