gpt4 book ai didi

rust - Rust:有没有一种方法可以缩短 `if/else`的 `from_request`部分?

转载 作者:行者123 更新时间:2023-12-03 11:41:29 24 4
gpt4 key购买 nike

有没有一种方法可以缩短if/elsefrom_request部分?

use uuid::Uuid;
#[derive(Debug)]
struct User {
token: Option<Uuid>,
}

impl FromRequest for User {
type Error = Error;
type Future = Ready<Result<Self>>;
type Config = ();
fn from_request(req: &HttpRequest, payload: &mut dev::Payload) -> Self::Future {
if let Some(t) = actix_web::HttpMessage::cookie(req,"token") {
if let Ok(u) = Uuid::parse_str(&t.value().to_owned()) {
futures::future::ok(User{token: Some(u)})
} else {
futures::future::ok(User{token: None})
}
} else {
futures::future::ok(User{token: None})
}
}
}
有什么办法可以删除 futures::future::ok(User{token: None})两次?
我尝试使用 map,如下所示:
Rust: Is there a way to shorten this if/else code using map?
但无法使它适用于嵌套if/else。

最佳答案

像这样吗?

fn from_request(req: &HttpRequest, payload: &mut dev::Payload) -> Self::Future {
let token = actix_web::HttpMessage::cookie(req, "token")
.and_then(|t| Uuid::parse_str(&t.value().to_owned()).ok());
futures::future::ok(User { token })
}
由于您不在乎解析 Uuid所导致的错误,因此它将调用 .ok(),它将 Result转换为 Option。这使您可以将可选值与 and_then链接在一起。

关于rust - Rust:有没有一种方法可以缩短 `if/else`的 `from_request`部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65951551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com