Deep Rust соответствия: есть ли лучший способ? - PullRequest
2 голосов
/ 23 июня 2019

Я просто обнаружил, что пишу это:

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

1 Ответ

5 голосов
/ 23 июня 2019

Вы ищете оператора ? , предназначенного для этой конкретной задачи.

foo()?

эквивалентно

match foo() {
    Ok(t)  => t
    Err(e) => return Err(e.into()),
}

Таким образом, вы можетепросто бросьте ? в конце всего, что возвращает реализацию Try.Вам придется заставить вашу функцию возвращать Result<(), E>, но это также хорошо, потому что тогда ваша функция будет сообщать о своих ошибках, а не молча.

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