Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 深锈匹配:有更好的方法吗?_Rust_Idioms - Fatal编程技术网

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!我不敢相信我到现在还没有遇到过。仍在试图找出如何使用它,同时使编译器高兴,但在理论上它似乎正是我所寻找的。