Rust中是否有类似?操作符的语法,出错时返回预定义值?
嘿,这个需求太常见了!其实你想要的简化写法完全可以通过组合Rust Result的方法来实现,不用绕弯子。
首先,你的原代码逻辑是:调用some_func,如果出错就直接返回预定义字符串;如果成功,就把结果传给try_decrypt_data并返回它的输出。我们可以用map和unwrap_or_else的组合把整个逻辑压缩成一行:
fn index() -> String { some_func("pass").map(try_decrypt_data).unwrap_or_else(|_| "No parameters named pass".to_string()) }
来拆解下这个写法:
map(try_decrypt_data):如果some_func返回Ok(data),就自动把data传给try_decrypt_data,得到新的Ok(try_decrypt_data(data));如果是Err,就保持原错误不变。unwrap_or_else(|_| ...):如果前面的结果是Ok(value),就取出value作为最终返回值;如果是Err,就执行闭包里的逻辑,返回你预定义的字符串。
这样整个表达式的结果刚好是String,直接作为index函数的返回值,完美替代了你原来的多行判断逻辑。
你之前说unwrap_or_else只能返回闭包内容,其实是没结合map一起用——单独用unwrap_or_else确实只能处理错误分支,但加上map就把成功分支的逻辑也串起来了,一步到位。
如果try_decrypt_data本身也返回Result类型的话,那我们可以把map换成and_then,它会自动处理链式的Result调用,比如:
// 假设 try_decrypt_data 返回 Result<String, SomeError> fn index() -> String { some_func("pass") .and_then(try_decrypt_data) .unwrap_or_else(|_| "No parameters named pass".to_string()) }
这个写法同样能达到你的需求,而且可读性也很好。
内容的提问来源于stack exchange,提问作者8176135
相关产品推荐
相关产品推荐

