Rust lazy_stati c подразумевает, что объекты нельзя удалить? - PullRequest
0 голосов
/ 19 июня 2020

Rust lazy_static crate позволяет нам создавать stati c объекты в 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 должен хранить stati c струны тоже. Означает ли это, что каждый раз, когда я что-то добавляю в эту хэш-карту, это невозможно удалить, поскольку это stati c?

1 Ответ

1 голос
/ 19 июня 2020

Любая строка, на которую вы можете ссылаться с помощью &'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 (и проще и эффективнее) использовать локальные переменные вместо статики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...