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

标签 rust reqwest

<分区>

我是 Rust 的新手,我想编写一个脚本来抓取页面并从中提取所有链接及其标题。我什至没有发出获取请求。 :(

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

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

我显然没有返回任何东西,但是我对语法感到困惑有人可以解释一下吗?运营商,还帮我解决了这个问题。

最佳答案

问号运算符只能在返回 std::Result 的函数中使用。粗略地说,您可以将 x? 视为意义

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

(参见文档 here)

await 产生错误结果时,您希望发生什么?如果您不希望错误发生,那么告诉 Rust 在错误发生时 panic (即崩溃)应该是安全的。这就是 Result::unwrap 的用途:

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

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

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

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

关于rust - 不能在返回 `?` 的函数中使用 `()` 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58373663/

相关文章:

rust - 在 None 值上调用 unwrap 时,try block 中的代码仍然会出现 panic

linux - 如何在 Linux 下从特定接口(interface)发送 UDP 数据包?

memory-management - 除了非文字进入堆之外,文字和非文字之间有什么区别?

syntax - 尝试导入 `reqwest::async` 错误说明 `async` 是保留关键字

ssl - 为什么 reqwest 需要安装 OpenSSL?

rust - 如何使用依赖的依赖类型?

rust - reqwest示例POST请求未编译

rust - 删除内联 mips 程序集中附加的 "break"指令

asynchronous - 如何将向量作为异步流处理?

traits - 如何修复 "actix_web::handler::AsyncFactory<_, _> is not implemented"错误?