首页 > 解决方案 > 不能在返回 `()` 的函数中使用 `?` 运算符

问题描述

我对 rust 很陌生,我想编写一个脚本来抓取页面并从中提取所有链接及其标题。我什至未能提出获取请求。:(

fn main() {
    println!("Started!");
    let body = reqwest::get("https://news.ycombinator.com")
    .await?
    .text()
    .await?;

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

我显然没有返回任何东西,但是我对语法感到困惑,有人可以解释吗?操作员,也帮我解决这个问题。

标签: rustreqwest

解决方案


问号运算符只能在返回 a 的函数内部使用std::Result。粗略地说,你可以认为x?是意义

match x {
    Err(e) => return Err(e),
    Ok(y) => y,
}

(请参阅此处的文档)

await当产生错误结果时你想发生什么?如果您不希望发生错误,那么告诉 Rust 恐慌(即崩溃)应该是安全的。这Result::unwrap是为了:

fn main() {
    println!("Started!");
    let body = reqwest::get("https://news.ycombinator.com")
        .await
        .unwrap()
        .text()
        .await
        .unwrap();

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

更有可能的是,您应该通过一些明确定义的行为负责任地处理错误结果。main这可能是试图恢复(即尝试不同的东西),或者如果您在顶级函数中,可能会记录错误消息并以非零代码退出。执行其中任何一项的简单方法是match自己使用语句。

从这个角度来看,操作员的意图很清楚?:这是一种表达方式:“处理这个错误不是我的责任,而是调用我的代码的责任。” 这里重要的是,决定如何处理错误仍然必须由某人负责。


推荐阅读