Error handling 这部电影怎么样?操作员是否与From特性交互?

Error handling 这部电影怎么样?操作员是否与From特性交互?,error-handling,rust,type-conversion,traits,Error Handling,Rust,Type Conversion,Traits,假设我有以下几点: 使用std::fs::File; 从无到有{ fn来自(b:i32)->废话{ 诸如此类 } } fn main(){} 枚举MyError{ 解析错误, } 来自MyError的impl{ fn-from(ux0:std::io::Error)->Self{ MyError::ParseError } } fn get_result()->result{ 让mut file=file::create(“foo.txt”)?; } 这很好。我不明白怎么做 File::cre

假设我有以下几点:

使用std::fs::File;
从无到有{
fn来自(b:i32)->废话{
诸如此类
}
}
fn main(){}
枚举MyError{
解析错误,
}
来自MyError的impl{
fn-from(ux0:std::io::Error)->Self{
MyError::ParseError
}
}
fn get_result()->result{
让mut file=file::create(“foo.txt”)?;
}
这很好。我不明白怎么做

File::create
抛出一个
std::io::error
,我们正试图将其包装成一个
MyError
。但是我们从不在任何地方显式地调用
!?它是如何编译的

正如此答案中的注释所示,您确实必须明确地从
调用


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

神奇之处在于
操作符

let mut file = File::create("foo.txt")?;
扩展为类似()

这使用了
Into
特征,它与
From
特征对应:
e.Into()
相当于
T::From(e)
。这里有显式转换


(,这就是为什么从
实现
就足够了。)

魔法在于
操作符

let mut file = File::create("foo.txt")?;
扩展为类似()

这使用了
Into
特征,它与
From
特征对应:
e.Into()
相当于
T::From(e)
。这里有显式转换


(,这就是为什么从
实现
就足够了。)

当谈到
操作符时,差异在中说明:

调用了
运算符的错误值通过from函数,该函数在标准库的
from
特性中定义,用于将错误从一种类型转换为另一种类型。当
操作员从
函数调用
时,收到的错误类型将转换为当前函数返回类型中定义的错误类型。当函数返回一种错误类型来表示函数可能失败的所有方式时,这非常有用,即使部分可能由于许多不同的原因而失败只要每个错误类型执行
from
函数来定义如何将自身转换为返回的错误类型,
运算符就会自动处理转换。


您已经为该错误类型提供了来自
实现,因此代码将自动工作并转换该类型的值。

当谈到
运算符时,差异在中说明:

调用了
运算符的错误值通过from函数,该函数在标准库的
from
特性中定义,用于将错误从一种类型转换为另一种类型。当
操作员从
函数调用
时,收到的错误类型将转换为当前函数返回类型中定义的错误类型。当函数返回一种错误类型来表示函数可能失败的所有方式时,这非常有用,即使部分可能由于许多不同的原因而失败只要每个错误类型执行
from
函数来定义如何将自身转换为返回的错误类型,
运算符就会自动处理转换。

您已经为该错误类型提供了来自
实现,因此代码将自动工作并转换该类型的值