0

我正在尝试从 reqwest文档中复制一个示例。这是示例:

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 `()`

我对这种行为有点惊讶,因为我的代码几乎文档代码。

我认为这?仅适用于 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 对象,就像文档一样?

4

2 回答 2

2

这里有两个不同的问题让你绊倒。

您链接到的文档是reqwestversion 0.9.18,但您已经安装了 version 0.10.10。如果您查看文档0.10.10,您会看到您使用的代码段是

let body = reqwest::get("https://www.rust-lang.org")
    .await?
    .text()
    .await?;

println!("body = {:?}", body);

或者在您的情况下更有可能,因为您没有提到拥有异步运行时blocking文档

let body = reqwest::blocking::get("https://www.rust-lang.org")?
    .text()?;

println!("body = {:?}", body);

请注意,当您尝试使用这个时,您仍然会得到它

不能?在返回的函数中使用运算符()

并且您需要在mainlike上设置返回类型

fn main() -> Result<(), reqwest::Error> {

请参阅为什么要尝试!()和?在不返回选项或结果的函数中使用时不编译?了解更多信息。

于 2021-01-04T02:11:02.123 回答
1

您可能想阅读 Rust 文档的这一部分:https ://doc.rust-lang.org/edition-guide/rust-2018/error-handling-and-panics/index.html

简而言之,只需通过隐式?将错误从调用堆栈的更上层传递出去。因此,您使用运算符的函数必须返回与使用该函数相同的类型。Resultreturn??

于 2021-01-04T02:06:56.263 回答