rust - 不能在返回 `()` 的函数中使用 `?` 运算符
问题描述
我对 rust 很陌生,我想编写一个脚本来抓取页面并从中提取所有链接及其标题。我什至未能提出获取请求。:(
fn main() {
println!("Started!");
let body = reqwest::get("https://news.ycombinator.com")
.await?
.text()
.await?;
println!("body = {:?}", body);
}
我显然没有返回任何东西,但是我对语法感到困惑,有人可以解释吗?操作员,也帮我解决这个问题。
解决方案
问号运算符只能在返回 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
自己使用语句。
从这个角度来看,操作员的意图很清楚?
:这是一种表达方式:“处理这个错误不是我的责任,而是调用我的代码的责任。” 这里重要的是,决定如何处理错误仍然必须由某人负责。
推荐阅读
- c++ - 无法从“<brace-enclosed initializer list>”转换为向量
- jquery - 如果输入表单有效,我如何显示消息
- tensorflow - tensorflow - nn.softmax 是否采取措施防止 exp(x) 变为 +inf
- python-3.x - 如何防止python中的内存需求增加以克服内存不足错误?
- xcode - 如何设置 Bundle Ids、App Identifiers 和 Provisioning Profiles 以发布使用 SwiftUI 和 XCode 制作的 WatchOs 应用程序?
- javascript - 粘性副标题在滚动时闪烁
- python - 如何使用 python 将数据从一个源移动到另一个源?
- arrays - 在 laravel 中按数量进行 foreach
- python - 如何修复 ValueError: Input 0 is in compatible with layer CNN: expected shape=(None, 35), found shape=(None, 31)
- flutter - Command CompileSwift 因非零退出代码权限处理程序插件而失败