繁体   English   中英

为什么Rust编译器不能使用From特性将库错误转换为我的错误?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM