Rust 深锈匹配:有更好的方法吗?
我刚刚发现自己在写这篇文章:Rust 深锈匹配:有更好的方法吗?,rust,idioms,Rust,Idioms,我刚刚发现自己在写这篇文章: fn init_时间戳(dir:&PathBuf,file_时间戳:&'static HashMap){ 匹配fs::读取目录(目录){ Ok(iter)=>iter.for|u每个(|结果|匹配结果{ 正常(输入)=>{ 如果entry.file_type().map(| t | t.is_dir()).unwrap_或(false){ init_时间戳(&entry.path(),file_时间戳); }否则{ 匹配条目。元数据(){ Ok(md)=>匹配md.
fn init_时间戳(dir:&PathBuf,file_时间戳:&'static HashMap){
匹配fs::读取目录(目录){
Ok(iter)=>iter.for|u每个(|结果|匹配结果{
正常(输入)=>{
如果entry.file_type().map(| t | t.is_dir()).unwrap_或(false){
init_时间戳(&entry.path(),file_时间戳);
}否则{
匹配条目。元数据(){
Ok(md)=>匹配md.modified(){
确定(修改)=>{
locked_timestamps.insert(entry.path(),modified.duration_自(SystemTime::UNIX_EPOCH).unwrap());
},
错误(41;)=>()
},
错误(41;)=>()
};
}
},
错误(41;)=>()
}),
错误(41;)=>()
};
}
我不得不问:我缺少的是更好的模式吗?我尝试在每个级别使用.map()
,这看起来稍微好一点,但给了我编译器关于未使用结果的警告。在一般情况下,我想做的是“如果这个结果链(或选项)一直存在,那么执行X。否则,什么都不做。”我也遇到过类似的情况,我想强制链中的“失败”点为false
(在最深的深度有一个布尔检查)
这实际上可以被看作是Rust版本的空检查问题,它是用其他语言中的空合并运算符解决的。您正在寻找的,是专为此任务设计的
foo()?
相当于
match foo() {
Ok(t) => t
Err(e) => return Err(e.into()),
}
因此,您可以在返回
Try
实现的任何内容的末尾抛出?
。你必须让你的函数返回结果
,但那也一样,因为这样你的函数会报告它的错误,而不是默默地失败。Wow!我不敢相信我到现在还没有遇到过。仍在试图找出如何使用它,同时使编译器高兴,但在理论上它似乎正是我所寻找的。