我需要在返回Result时将解析错误转换为我自己的Error类型。简化后,它看起来如下所示:
enum MyError {
Parse,
...,
}
fn process<R: FromStr>(s: &str) -> Result<(), MyError> {
Ok(s.parse::<R>()?)
}
要使上述工作从特性开始实施。这不起作用:
impl From<std::str::FromStr::Err> for MyError {
fn from(e: std::str::FromStr::Err) -> MyError {
MyError::Parse
}
}
编译器诊断:
help: use fully-qualified syntax: `<Type as std::str::FromStr>::Err`
但是我不知道确切的Type
。关键是要允许所有可能的错误转换。
答案 0 :(得分:2)
类型FromStr::Err
是具有FromStr
特性的关联类型。 FromStr
的每个实现都有其自己的关联类型,并且该类型是完全不受约束的-它可以是任何类型。这意味着您需要从任何类型到MyError
的转换才能实现所需的目标:
impl<T> From<T> for MyError {
fn from(e: T) -> MyError {
MyError::Parse
}
}
但是,一致性规则不允许此实现–它与标准库中任何类型From<T>
的{{1}}的实现冲突。即使允许这种实现,它也不会真正做您想要做的-任何错误类型都将转换为T
,而不仅仅是解析错误。
一种可能的解决方法是为解析错误类型引入标记特征:
MyError::Parse
然后您可以为所有解析错误类型实现此标记特征:
trait ParseError {}
impl<T: ParseError> From<T> for MyError {
fn from(e: T) -> MyError {
MyError::Parse
}
}
答案 1 :(得分:1)
如果仍然要丢弃解析错误,请使用map_err
在本地更改错误:
NSTrackingArea