Обновить / повторно инициализировать переменную, определенную в lazy_static - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть конфигурация, которую я хочу инициализировать при запуске, но мне не нужно каждый раз перечитывать файл. Чтобы сделать это, я использую lazy_stati c:

lazy_static! {
  static ref SETTINGS: Settings = {
    match Settings::init() {
      Ok(c) => c,
      Err(e) => panic!("{}", e),
    }
  };
}

Но теперь у меня есть метод, который обновляет этот файл конфигурации, и я хочу "повторно инициализировать" / обновить его, без необходимости Перезапустите программу.

  pub fn save_config_file(data: &str) -> Result<String, Error> {
    fs::write(CONFIG_FILE, data)?;
    SETTINGS = {
      match Settings::init() {
        Ok(c) => c, // The line with the error
        Err(e) => panic!("{}", e),
      }
    };

    Self::read_config_file()
  }

Что дает мне ошибку: [rustc E0308] [E] mismatched types expected struct settings::SETTINGS, found struct settings::Settings

Есть ли способ повторно инициализировать lazy_stati c? Или мне нужно перезапустить программу?

1 Ответ

0 голосов
/ 11 апреля 2020

Хорошо, понял это. Главным образом отсюда: Как назначить строку для изменяемой переменной stati c?

Добавить производный клон в вашу структуру:

#[derive(Debug, Deserialize, Clone)]

Оберните ваши lazy_stati c в RwLock, инициализируйте его как обычно.

use std::sync::RwLock;

lazy_static! {
  static ref SETTINGS: RwLock<Settings> = RwLock::new(
    match Settings::init() {
      Ok(c) => c,
      Err(e) => panic!("{}", e),
    }
  );
}

Чтобы прочитать, вы можете сделать это:

  pub fn get() -> Self {
    SETTINGS.read().unwrap().to_owned()
  }

Написать:

    let mut new_settings = SETTINGS.write().unwrap();
    *new_settings = match Settings::init() {
      Ok(c) => c,
      Err(e) => panic!("{}", e),
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...