gpt4 book ai didi

rust - 深 rust 匹配 : is there a better way?

转载 作者:行者123 更新时间:2023-11-29 08:03:34 28 4
gpt4 key购买 nike

我刚刚发现自己在写这个:

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 (在最深度有一个 bool 检查)。

这实际上可以看作是 Rust 版本的空检查问题,在其他语言中通过空合并运算符解决 such as Kotlin .

最佳答案

您正在寻找 ? operator ,专为这项任务而设计。

foo()?

相当于

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

所以你可以直接抛出 ?在返回 Try 的任何内容的末尾执行。你必须让你的函数返回 Result<(), E> ,但这也没关系,因为这样你的函数就会报告它的错误,而不是默默地失败。

关于rust - 深 rust 匹配 : is there a better way?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56720236/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com