我只是发现自己在写这篇文章:
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(_) => ()
};
}
Run Code Online (Sandbox Code Playgroud)
我不得不问:我是否缺少更好的模式?我尝试.map()在每个级别上使用,这看起来稍好一些,但是给了我关于未使用结果的编译器警告。在这种一般情况下,我想做的是“如果结果链(或选项)一直存在,则执行X。否则,不执行任何操作。” 我也遇到过类似的情况,我想强制执行链中的“失败”点false(在最深处进行布尔检查)。
实际上,这可以看作是Rust的null检查问题版本,可以使用其他语言(?.)的null-coalescing运算符解决:https : //kotlinlang.org/docs/reference/null-safety.html#safe-calls
您正在寻找针对此确切任务而设计的?操作员。
foo()?
Run Code Online (Sandbox Code Playgroud)
相当于
match foo() {
Ok(t) => t
Err(e) => return Err(e.into()),
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以将?所有返回Try实现的内容放在结尾。您必须使函数返回Result<(), E>,但这也一样,因为那样您的函数将报告其错误而不是默默地失败。
| 归档时间: |
|
| 查看次数: |
687 次 |
| 最近记录: |