gpt4 book ai didi

rust - 折叠 rust 匹配

转载 作者:行者123 更新时间:2023-12-03 11:45:10 27 4
gpt4 key购买 nike

我是 rust 新手,我错过了 if letguard let Swift 中的符号。
我有以下代码块:

fn some_function() -> Option<String> {
let client = reqwest::Client::new();

// res is normally a response type. I've mapped it to an Option type to drop the error
let res = client
.post(&complete_path)
.basic_auth(self.username.clone(), Some(self.password.clone()))
.send()
.ok();

// Verify status code and exist if res = None, or status !== 200
let mut response = match res {
Some(res) => match res.status() {
StatusCode::OK => res,
_ => return None
},
_ => return None
};

// Attempt to read the body contents
let token = match response.text() {
Ok(data) => Some(data),
Err(_e) => None
};

token
}
我很快就会写出类似的东西:
guard let response = response,
response.status == 200
let text = response.text() else {
return None
}
return text
我错过了一些速记符号吗?
我正在尝试利用 return 从任何地方返回的能力。短路一些执行,但它仍然比我熟悉的要冗长得多。

编辑:
我可以使用 match + 子句语法消除一些 rust 迹,如下所示:
let mut response = match res {
Some(res) if res.status() == StatusCode::OK => res,
_ => return None
}
这比原来的好多了。
如果 let 也可以,但是 if let 的问题这是我在这里查看的失败路径。我不想在幸福的道路上嵌套。

最佳答案

有人建议制作更灵活的等价物(守卫,if let … && …),但在这种情况下,因为您要通过返回 None 退出您可以使用 the question mark operator :

fn some_function() -> Option<String> {
let client = reqwest::Client::new();

let res = client
.post(&complete_path)
.basic_auth(self.username.clone(), Some(self.password.clone()))
.send()
.ok()?;

if res.status() != StatusCode::OK {
return None;
}

response.text().ok()
}
还考虑返回 Result<String, …> ( Box<dyn Error> ?) 代替,这可能是一个更干净的 API,它可以让你跳过 .ok() .

关于rust - 折叠 rust 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62924200/

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