我有一个作为API端点的结构,因此无法更改其结构
struct Response {
error: Option<String>,
results: Vec<String>,
}
字符串
如果error
是Some
,这意味着它在服务器端失败。
我有一个函数返回结构体:
fn get_results() -> Result<Response, String> {
unimplemented!()
}
型
是否可以在同一个match
分支中匹配get_results
Result
错误和可选的Response.error
?
这是我的尝试:
fn example() {
let ret = get_results();
match ret.map(|resp| resp.error.map_or_else(|| Ok(resp.results), |e| Err(e))) {
Err(e) => {
println!("Error: {}", &e);
}
Ok(results) => {
//Handle results
}
}
}
型
但它失败了:
error[E0382]: use of moved value: `resp`
--> src/lib.rs:12:49
|
12 | match ret.map(|resp| resp.error.map_or_else(|| Ok(resp.results), |e| Err(e))) {
| ---------- ^^ ---- use occurs due to use in closure
| | |
| | value used here after move
| value moved here
|
= note: move occurs because `resp.error` has type `std::option::Option<std::string::String>`, which does not implement the `Copy` trait
型
3条答案
按热度按时间xzlaal3s1#
您可以将响应转换为如下结果:
字符串
你可以使用
and_then
来扁平化嵌套的结果。综合起来,它给出了:型
jtjikinw2#
如果error字段是public,你可以这样做:
字符串
这显示了Rust的match语句是多么强大。
Playground of a simplified example
ie3xauqp3#
使用2021年的Rust版本,您的程序现在按原样运行。
尽管如此,我还是更喜欢let-else语法,因为它使程序更清晰:
字符串