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
函数来定义如何将自身转换为返回的错误类型,?
运算符就会自动处理转换。
您已经为该错误类型提供了来自
的实现,因此代码将自动工作并转换该类型的值