Rust中如何在获取None时提前返回且避免使用unwrap?
解决方案
你可以使用Rust 1.65及以上版本支持的let ... else语句,这是最简洁的实现方式,无需显式的if或match判断,直接完成None分支的返回和Some值的解包绑定:
async fn found_player(id: u64, repo: &Repo) -> Result<Option<Player>, DbError> { // 匹配成功则将Player实例绑定到player变量,失败则直接返回Ok(None) let Some(player) = repo.player_by_id(id).await? else { return Ok(None); }; // 后续代码直接使用已解包的player,无需调用unwrap player.update_last_active().await?; // 其他业务逻辑... Ok(Some(player)) }
说明
let ... else是Rust专门为这种“模式匹配成功则绑定变量,失败则执行退出逻辑”的场景设计的语法,它不属于if或match表达式范畴,完全符合你的需求:
- 遇到
None时直接返回Ok(None),无需额外判断 Some中的Player实例会被直接绑定到player变量,后续代码可直接使用,无需手动解包
内容的提问来源于stack exchange,提问作者Fred Hors
相关产品推荐
相关产品推荐

