如何在 Rust 中将多个通用错误类型包装在自定义 Error 枚举周围。这很简单,我只想让它工作。
enum Error<SPIE, PINE> {
SpiError(SPIE),
PinError(PINE),
// other custom errors
}
impl<SPIE,PINE> From<SPIE> for Error<SPIE,PINE> {
fn from(value: SPIE) -> Self {
Self::SpiError(value)
}
}
impl<SPIE,PINE> From<PINE> for Error<SPIE,PINE> {
fn from(value: PINE) -> Self {
Self::PinError(value)
}
}
相反,编译器抱怨说:
conflicting implementations of trait `From<_>` for type `Error<_, _>`
我理解这一点,但也许我可以以某种方式区分这两种类型……
这行不通,因为没有办法限制
SPIE
和PINE
为不同类型。如果您尝试将转换Foo
为Error<Foo, Foo>
,From
应该使用哪种实现?我不确定是否有比直接构造枚举变量更好的方法。如果您的目标是能够在函数中使用,那么您可以在此之前调用类似
?
方法将错误包装在变量中。map_err
.map_err(Error::SpiError)?
SpiError
有两点可能使其更加符合人体工程学:
SpiError
当您已经使用带有后缀的类型时,名称就是多余的Error
——为什么不呢enum Error<SPIE, PINE> { Spi(SPIE), Pin(PINE) }
?use Error::*;
直接导入变体。结合这两者,上面的
map_err
咒语可以缩短为.map_err(Spi)?
。它不是自动的,但也不是一大堆样板——我一直都使用这种方法。