gpt4 book ai didi

rust - 如何在匹配结构中设置所需的返回类型?

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

在serde_json的条板箱文档(将JSON解析为Rust结构)中的示例中,省略了错误处理:

use serde::{Deserialize, Serialize};
use serde_json::Result;

#[derive(Serialize, Deserialize)]
struct Person {
name: String,
age: u8,
phones: Vec<String>,
}

fn typed_example() -> Result<()> {
// Some JSON input data as a &str. Maybe this comes from the user.
let data = r#"
{
"name": "John Doe",
"age": 43,
"phones": [
"+44 1234567",
"+44 2345678"
]
}"#;

// Parse the string of data into a Person object. This is exactly the
// same function as the one that produced serde_json::Value above, but
// now we are asking it for a Person as output.
let p: Person = serde_json::from_str(data)?;

// Do things just like with any other Rust data structure.
println!("Please call {} at the number {}", p.name, p.phones[0]);

Ok(())
}
from_string()的作用由分配的 目标的类型控制。
实际上,我们必须处理该错误。因此,自然要做的是:
match p: Person = serde_json::from_str(data) {
// ...
}
但这在匹配结构中是不允许的。
match serde_json::from_str(data) {
// ...
}
始终返回空类型“()”。
我的情况涉及许多嵌套的匹配结构,因此我不想使用明显的解决方案,即先分配变量。
如何在匹配结构中控制所需的目标表达式类型?

最佳答案

在您给出的示例中,错误处理被延迟给调用方:

let p: Person = serde_json::from_str(data)?;

请注意最后的 ?:这意味着在发生错误的情况下,该函数应立即返回以传播错误。

如果要在本地处理错误,则需要使用 match,但不能执行 match p: Person = serde_json::from_str(data) { /* ... */ },因为 from_str不会返回 Person。您需要做的是:
let p: Person = match serde_json::from_str (data) {
Ok (p) => p,
Err (_) => Person { name: "John Doe".into(), age: 42, phones: vec![] },
}

关于rust - 如何在匹配结构中设置所需的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60332602/

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