被一个初级问题困然住了,希望大家帮助:
我写了一个测试程序( 代码附后 ),使用 reqwest 请求页面,其中:
1)首先声明一个变量 rslt_obj ,类型是一个 Result<T,E>
- 然后给 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"]
提前多谢大家
1
共 5 条评论, 1 页
评论区
写评论楼上说得没错,主要是
let number = match...
里面number
须在编译的时候确定类型。试图给它两种类型是不会成功的。感谢两位答复,我对这个问题的认识清楚一些啦!
match 语句的每个分支要返回相同类型。这里没必要用 match,用 unwrap 或 ? 就可以了。建议先读一遍 the book 。
还是不明白,
match 的对象是 Result :
1)(经过运行时确认,也是 Result类型)
2) 为什么编译时,却提示不支持Err(e)呢?
回复的时候不支持MarkDown 格式,
因此,我把内容放到这里了:
http://cuobiezi.net/t/show/58124
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.