繁体   English   中英

为什么 Rust 在匹配中期望 Err 中的 OK 结构?

[英]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).awaituser的推断类型。 这就是编译器期望从所有其他匹配臂返回相同类型的原因。 您可以向user提供显式类型注释,但这只会给您带来不同的错误,直到您解决问题:匹配臂的返回类型不一致。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM