< 返回版块

我要去桂林 发表于 2020-04-04 21:59

Tags:result,match

被一个初级问题困然住了,希望大家帮助:

我写了一个测试程序( 代码附后 ),使用 reqwest 请求页面,其中:

1)首先声明一个变量 rslt_obj ,类型是一个 Result<T,E>

  1. 然后给 rslt_obj 变量赋值

3)为了防止 rslt_obj 有调用失败的情况,比如,网址写错了,写成:httttp::// 我使用 match 来匹配是否有错误发生 Err(e)

4)但是编译器提示:Err(e)这一行错误为:

           expected struct 
          `reqwest::blocking::response::Response`, 
          found struct `reqwest::error::Error`

5)rslt_obj 不是应该是一个 Result 吗? 为什么编译器需要:Response类型呢?

测试代码如下:

#[test]
fn test_req_0001()  {
    let url_test = "http://www.cuobiezi.net";
    let rslt_obj : reqwest::Result< reqwest::blocking::Response>;
    rslt_obj  =  reqwest::blocking::get( url_test );
    let resp_obj_new = match rslt_obj{
        Ok(one_obj)  => one_obj,
        Err(e) => e,
    };
    //如果上面match顺利,是否需要写类似: if resp_obj_new != Error 执行下面这一行
    let resp = resp_obj_new.json::<HashMap<String, String>>();
    println!("resp content:{:#?}", resp);
}

Cargo.toml 相关内容如下:

[dependencies.reqwest]
version = "0.10.*"
default-features = false
features = ["default-tls", "blocking", "gzip", "json"]

提前多谢大家

评论区

写评论
Nalleyer 2020-04-06 09:39

楼上说得没错,主要是let number = match...里面number须在编译的时候确定类型。试图给它两种类型是不会成功的。

作者 我要去桂林 2020-04-05 09:11

感谢两位答复,我对这个问题的认识清楚一些啦!

linsui 2020-04-05 00:01

match 语句的每个分支要返回相同类型。这里没必要用 match,用 unwrap 或 ? 就可以了。建议先读一遍 the book 。

作者 我要去桂林 2020-04-04 23:43

还是不明白,

match 的对象是 Result :

1)(经过运行时确认,也是 Result类型)

2) 为什么编译时,却提示不支持Err(e)呢?

回复的时候不支持MarkDown 格式,

因此,我把内容放到这里了: 

http://cuobiezi.net/t/show/58124

chinagxwei 2020-04-04 22:27

Result<T, E>, 其中 T 和 E 都是 enum Result 的成员. 当成功返回数据的时候, Result 会返回 T , 失败会返回 E . 你在rslt_obj 的类型声明中已经声明了 T 的类型是 reqwest::blocking::Response, 那么当 Result 成功返回数据时会返回 reqwest::blocking::Response. 白话点的说法是 reqwest 的行为结果是 Result. 成功的 Result 是 T : reqwest::blocking::Response , 失败的 Result 是 E : reqwest::error::Error.

1 共 5 条评论, 1 页