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