簡體   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