我尝试从reqwest documentation中复制一个示例。
let body = reqwest::get("https://www.rust-lang.org")?
.text()?;
在Cargo.toml文件中添加了reqwest = "0.10.10"
行之后,我在main.rs
文件中添加了以下代码:
extern crate reqwest;
fn main() {
let body = reqwest::get("https://www.rust-lang.org")?.text()?;
println!("body = {:?}", body);
}
此代码不编译并返回以下错误:
cannot use the `?` operator in a function that returns `()`
我对这种行为有点惊讶,因为我的代码几乎是 ipsis litteris 文档代码。
我认为?
只适用于Response对象,所以我检查了get
方法返回的是哪个对象:
extern crate reqwest;
fn print_type_of<T>(_: &T) {
println!("{}", std::any::type_name::<T>())
}
fn main() {
let body = reqwest::get("https://www.rust-lang.org");
print_type_of(&body);
}
输出:
core::future::from_generator::GenFuture<reqwest::get<&str>::{{closure}}
我的意思是,为什么我没有得到一个Response对象,就像文档一样?
3条答案
按热度按时间roqulrg31#
这里有两个不同的问题绊倒你。
您链接到的文档是针对
reqwest
版本0.9.18
的,但您安装的是0.10.10
版本。或者在您的情况下更有可能,因为您没有提到异步运行时the
blocking
docs请注意,当您尝试使用此选项时,您 * 仍然 * 会得到
不能在返回
()
的函数中使用?
运算符并且您需要在
main
上设置一个返回类型,如有关详细信息,请参阅Why do try!() and ? not compile when used in a function that doesn't return Option or Result?。
jum4pzuy2#
您可能需要阅读Rust文档的以下部分:https://doc.rust-lang.org/edition-guide/rust-2018/error-handling-and-panics/index.html
简而言之,
?
只是通过隐式return
将错误从Result
传递到调用堆栈的更上层。因此,使用?
运算符的函数必须返回与使用?
的函数相同的类型。hkmswyz63#
每个响应都被 Package 在一个可以展开的
Result
类型中。Cargo.toml: