如何将含unwrap的Rust代码改写为单行if let形式(闭包禁用?)
改写Rust unwrap代码为if let形式的解决方案
当然可以,你可以利用and_then方法将两个Result类型的操作串联起来,从而用if let Ok(date)一次性匹配整个链式调用的结果,代码如下:
if let Ok(date) = file.metadata().and_then(|meta| meta.modified()) { // 在这里使用获取到的date }
如果要写成严格的单行形式,也可以压缩为:
if let Ok(date) = file.metadata().and_then(|meta| meta.modified()) { /* 处理date的逻辑 */ }
说明
file.metadata()返回Result<Metadata, Error>,调用and_then(|meta| meta.modified())后,只有当前一个Result是Ok时,才会执行后续的modified()操作(它同样返回Result<SystemTime, Error>);如果前一步失败,整个链式调用会直接返回对应的错误。- 这种写法既避免了
unwrap()可能引发的panic,又适配了闭包中无法使用?运算符的场景,成功时进入分支处理date,失败时直接跳过该分支。
内容的提问来源于stack exchange,提问作者Vincent Ryder
相关产品推荐
相关产品推荐

