![](/img/trans.png)
[英]Why does Rust implicitly convert between Error types when using '?' but not in return value?
[英]Why does the Rust compiler not convert from a library error to my error using the From trait?
给定这个板条箱引用了另一个板条箱的错误,我通常会写一个From
实现来转换类型。
use xladd::variant::{Variant, XLAddError};
use failure::Fail;
use std::convert::TryInto;
use std::convert::From;
use std::error::Error;
#[derive(Debug, Fail)]
enum AARCError {
#[fail(display = "F64 Conversion failure")]
ExcelF64ConversionError,
#[fail(display = "Bool Conversion failure")]
ExcelBoolConversionError,
#[fail(display = "Conversion failure")]
ExcelStrConversionError,
}
impl From<XLAddError> for AARCError {
fn from(err: XLAddError) -> Self {
AARCError::ExcelF64ConversionError // Test for now
}
}
pub fn normalize(array: Variant, min: Variant, max: Variant, scale: Variant) -> Result<Variant, AARCError> {
let min: f64 = min.try_into().map_err(|e| AARCError::from(e))?;
Ok(Variant::from_str("foo"))
}
但是在这种情况下,我得到一个错误:
error[E0277]: the trait bound `basic_stats::AARCError: std::convert::From<!>` is not satisfied
--> src\basic_stats.rs:24:48
|
24 | let min: f64 = min.try_into().map_err(|e| AARCError::from(e))?;
| ^^^^^^^^^^^^^^^ the trait `std::convert::From<!>` is not implemented for `basic_stats::AARCError`
|
= help: the following implementations were found:
<basic_stats::AARCError as std::convert::From<xladd::variant::XLAddError>>
= note: required by `std::convert::From::from`
我不明白From<!>
特质是什么,并且试图实现类似这样的操作会给未命名的类型带来错误。
我应该怎么做才能使Rust将外部包装箱的错误转换为我的错误?
我不明白
From<!>
特质是什么,并且试图实现类似这样的操作会给未命名的类型带来错误。
!
是“从不”或无人居住的类型; 没有可能值的类型。
如果Result
有!
对于其错误类型,这意味着操作不会失败。 无法将其转换为其他错误类型,因为错误值不能一开始就存在。
Never类型目前是一项实验功能,需要每晚构建Rust。 因此,它可能具有一些粗糙的边缘,并且没有达到人体工程学。 例如,我希望最终功能为所有实现了TryFrom<T>
且关联类型为Error = !
类型提供一揽子From<T>
实现Error = !
。 不必处理不可能发生的错误应该变得很容易。
要解决当前的问题,您可以将该错误映射到unreachable!()
。 这种方法的唯一问题是转发兼容性-如果第三方包装箱后来引入了可到达的错误,则您的代码将有未处理的错误,并且没有编译时错误可以保护您。 这可能就是原因之一!
尚未稳定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.