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