Я просто обнаружил, что пишу это:
fn init_timestamps(dir: &PathBuf, file_timestamps: &'static HashMap<PathBuf,Duration>) {
match fs::read_dir(dir) {
Ok(iter) => iter.for_each(|result| match result {
Ok(entry) => {
if entry.file_type().map(|t| t.is_dir()).unwrap_or(false) {
init_timestamps(&entry.path(), file_timestamps);
} else {
match entry.metadata() {
Ok(md) => match md.modified() {
Ok(modified) => {
locked_timestamps.insert(entry.path(), modified.duration_since(SystemTime::UNIX_EPOCH).unwrap());
},
Err(_) => ()
},
Err(_) => ()
};
}
},
Err(_) => ()
}),
Err(_) => ()
};
}
И я должен спросить: есть ли лучший шаблон, который я пропускаю?Я попытался использовать .map()
на каждом уровне, который выглядел немного лучше, но дал мне предупреждения компилятора о неиспользованных результатах.В этом общем случае я хочу сделать следующее: «если эта цепочка результатов (или параметров) существует полностью, делайте X. в противном случае ничего не делайте».Я также сталкивался с подобными ситуациями, в которых я хотел бы привести «неудачные» точки в цепочке к false
(есть логическая проверка на самой полной глубине).
Это на самом деле можно рассматривать как версию Rustпроблема проверки нуля, решаемая с помощью оператора объединения нулей в других языках (?.
): https://kotlinlang.org/docs/reference/null-safety.html#safe-calls