![](/img/trans.png)
[英]Why is Rust ok with accepting a different struct when implementing the same trait?
[英]Why does Rust expects an OK struct in Err in match?
所以我有以下代码,它基本上使用hyper
库执行 HTTP 请求。 然后它解码服务器发送的 json。 但是,在Err(err) => {...}
中, Rust 会抛出expected struct User, found ()
。 为什么 Rust 期望在Err(err) => {...}
中返回 User 结构?
use hyper::body::Buf;
use hyper::Client;
use serde::Deserialize;
#[tokio::main]
async fn main() {
let url = "http://jsonplaceholder.typicode.com/users/1"
.parse()
.unwrap();
let user = match fetch_json(url).await {
Ok(data) => data,
Err(err) => {
println!("Some error occured {}", err);
// expected struct User, found ()
}
};
// print users
println!("users: {:#?}", user);
}
async fn fetch_json(url: hyper::Uri) -> Result<User, Box<dyn std::error::Error + Send + Sync>> {
let client = Client::new();
// Fetch the url...
let res = client.get(url).await?;
let response_code = res.status();
// asynchronously aggregate the chunks of the body
let body = hyper::body::aggregate(res).await?;
// try to parse as json with serde_json
let user = serde_json::from_reader(body.reader())?;
Ok(user)
}
#[derive(Deserialize, Debug)]
struct User {
id: i32,
name: String,
}
为什么 Rust 期望在 Err(err) => {...} 中返回一个用户结构
但返回类型是
Result<User, Box<dyn std::error::Error + Send + Sync>>
但事实并非如此。 您的Ok
匹配 arm 返回data
,即User
。 因此,这已成为let user = match fetch_json(url).await
中user
的推断类型。 这就是编译器期望从所有其他匹配臂返回相同类型的原因。 您可以向user
提供显式类型注释,但这只会给您带来不同的错误,直到您解决问题:匹配臂的返回类型不一致。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.