如何用函数式写法替代这段Rust代码中的match语句?
函数式风格替换Rust中的match分支
可以用 Result 的 or_else 方法结合异步闭包来重写这段逻辑,完全替代原有的 match 块:
second_db.player_create(player_id) .await .or_else(|err| async move { first_db.player_delete(player_id).await?; Err(err) }.await)
逻辑说明
or_else是Result类型的原生方法:当原结果为Ok时,直接返回该值;当结果为Err时,执行传入的闭包并返回闭包的结果,完美匹配原match的分支逻辑。- 异步闭包里先执行
first_db.player_delete的异步操作,用?处理删除可能出现的错误(如果删除失败,整个表达式会直接返回删除的错误,和原代码行为一致),之后返回最初的创建错误。 - 闭包用
move捕获player_id和err,保证异步操作能访问到这些变量。
变体:忽略删除错误
如果不需要处理删除操作的错误(即使删除失败,仍返回创建时的错误),可以修改为:
second_db.player_create(player_id) .await .or_else(|err| async move { let _ = first_db.player_delete(player_id).await; Err(err) }.await)
内容的提问来源于stack exchange,提问作者Fred Hors
相关产品推荐
相关产品推荐

