首页 > 解决方案 > 怎么样?运算符与 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.

那么,上面的代码片段是如何编译的呢?

标签: error-handlingrusttype-conversiontraits

解决方案


魔力在于?操作员。

let mut file = File::create("foo.txt")?;

扩展到类似(来源

let mut file = match File::create("foo.txt") {
    Ok(t)  => t,
    Err(e) => return Err(e.into()),
};

这使用了Intotrait,它是Fromtrait:的对应物:e.into()等价于T::from(e). 在这里,您可以进行显式转换。

每个都有一个自动impl<T, U> Into<U> for Timpl<T, U> From<T> for U的,这就是为什么实施From就足够了。)


推荐阅读