Rust中如何简化嵌套ok_or()调用?无需改返回类型或辅助函数
解决方案
可以通过两种方式减少重复的.ok_or()调用,且不需要修改返回类型或现有辅助函数:
1. 预定义错误实例并复用
既然所有错误场景返回的都是同一个AppError实例,先提前创建好这个错误,后续重复引用即可:
pub async fn refresh_uses_session( State(app_state): State<AppState>, cookie_jar: CookieJar, ) -> Result<Response, AppError> { // 提前创建错误实例,后续复用 let auth_error = (StatusCode::UNAUTHORIZED, "Invalid Credentials").into_app_error(); let refresh_token_cookie = cookie_jar .get("refresh_token") .ok_or(auth_error.clone())?; let cookie_expiration_time = refresh_token_cookie .expires() .ok_or(auth_error.clone())? .datetime() .ok_or(auth_error)?; if cookie_expiration_time <= OffsetDateTime::now_utc() { return Err(auth_error); } //… }
注:如果
AppError未实现Clone,可以改为每次通过闭包生成错误(比如|| (StatusCode::UNAUTHORIZED, "Invalid Credentials").into_app_error()),但预定义实例+克隆的方式代码更简洁,通常自定义错误实现Clone成本很低。
2. 使用局部宏封装逻辑
定义一个局部宏,把重复的.ok_or(...)逻辑封装进去,调用时只需传入要处理的表达式:
pub async fn refresh_uses_session( State(app_state): State<AppState>, cookie_jar: CookieJar, ) -> Result<Response, AppError> { // 局部宏,封装授权错误的ok_or逻辑 macro_rules! auth_ok_or { ($expr:expr) => { $expr.ok_or((StatusCode::UNAUTHORIZED, "Invalid Credentials").into_app_error())? }; } let refresh_token_cookie = auth_ok_or!(cookie_jar.get("refresh_token")); let cookie_expiration_time = auth_ok_or!(auth_ok_or!(refresh_token_cookie.expires()).datetime()); if cookie_expiration_time <= OffsetDateTime::now_utc() { return Err((StatusCode::UNAUTHORIZED, "Invalid Credentials").into_app_error()); } //… }
这种方式完全避免了重复书写错误构造代码,代码可读性也更强。
内容的提问来源于stack exchange,提问作者Mohit Kumar
相关产品推荐
相关产品推荐

