error-handling - 怎么样?运算符与 From 特征交互?
问题描述
说我有以下内容:
use std::fs::File;
impl From<i32> for Blah {
fn from(b:i32) -> Blah {
Blah {}
}
}
fn main() {}
enum MyError {
ParseError,
}
impl From<std::io::Error> for MyError {
fn from(_:std::io::Error) -> Self {
MyError::ParseError
}
}
fn get_result() -> Result<Blah, MyError> {
let mut file = File::create("foo.txt")?;
}
这编译得很好。我不明白怎么做。
File::create
抛出一个std::io::error
,我们试图将其包裹在一个MyError
. 但是我们从不明确地调用from
任何地方!?它是如何编译的?
正如这个答案中的评论Rust理解 From trait表明,你必须明确地调用from
.
那么,上面的代码片段是如何编译的呢?
解决方案
魔力在于?
操作员。
let mut file = File::create("foo.txt")?;
扩展到类似(来源)
let mut file = match File::create("foo.txt") {
Ok(t) => t,
Err(e) => return Err(e.into()),
};
这使用了Into
trait,它是From
trait:的对应物:e.into()
等价于T::from(e)
. 在这里,您可以进行显式转换。
(每个都有一个自动impl<T, U> Into<U> for T
impl<T, U> From<T> for U
的,这就是为什么实施From
就足够了。)
推荐阅读
- artifactory - 由于 derby 文件日志大小,Artifactory 无法初始化
- javascript - JS/jQuery 删除带有或不带有斜杠的 URL 的最后一部分
- python - 启动 anaconda Prompt 后出现错误系统找不到指定的路径
- c++ - 为什么互斥锁可以在 C++ 中锁定两次而不解锁?
- php - 如何使用 ?在网址中?
- android - Android Studio 在更新 4.0.1 后不工作
- javascript - Chrome 扩展:在 Angular 站点中准备好 DOM 后,无法获取 DOM 元素
- python - 无法使用视图名称“usermodel-detail”解析超链接关系的 URL
- python-3.x - Python 3 Imaplib -(错误:EXPUNGE 失败,BAD [b'Command Argument Error.11'])无法从 Microsoft 服务帐户中删除邮件
- parsing - 斯坦福解析器 - amod 和 nsubj 依赖关系 - 谓词和定语形容词的组合