koala написав:Ще тут може згодитися let else. Якось я пропустив, а воно ж з версії 1.65 (листопад 22 року) є. Мабуть, саме тому, що 22 рік, я взагалі не стежив тоді.
Стандартний спосіб "розгортати" змінні - зіставлення з шаблоном у if let:
if let Some(x) = option {
тут є змінна x
} else {
інша ситуація
}
Ну так от, якщо "інша ситуація" є розбіжною (diverge), тобто завжди або панікує, або робить return (що досить часто відбувається), це можна скоротити до
let Some(x) = option else {
інша ситуація
}
тут є змінна x
Хоча тоді саму помилку не захопите.
if let — гарний вибір, якщо треба якийсь один варіант відсіяти.
Ось чим у мене все закінчилося.
fn get_fluent_bundle(new_settings: &gio::Settings,
new_window: Rc<gtk::ApplicationWindow>) ->FluentBundle<FluentResource>{
let new_fluent_bundle: FluentBundle<FluentResource>;
match download_fluent_bundle(&new_settings){
Err(why) => {
let error_message = format!(
"{}\n Therefore default en-US locale was downloaded.", why.to_string());
get_error_dialog(&error_message, new_window);
let langid: LanguageIdentifier = "en-US".parse().expect("LangId parsing failed");
new_fluent_bundle = FluentBundle::new(vec![langid]);
},
Ok(bundle) => {new_fluent_bundle = bundle;},
};
new_fluent_bundle
}
FluenBundle мені в будь-якому разі треба повертати, бо він далі використовується для локалізації інтерфейсу.
Просто у випадку помилки він порожній плюс повідомлення про помилку користувачу.
Ось як переклад слова завантажується:
let quit_title = get_translated_word(&self.fluent_bundle, &"Quit".to_string())
.unwrap_or("Quit".to_string());
unwrap_or створює стандартну англійську версію інтерфейсу,
що працює за будь-яких умов, бо вона, по суті, вбудована в код.