繁体   English   中英

为另一个特征项目类型实现特征

[英]Implement a trait for another trait Item type

返回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 关键是要允许所有可能的错误转换。

类型FromStr::ErrFromStr特征的关联类型 FromStr每个实现都有其自己的关联类型,并且该类型是完全不受约束的-可以是任何类型。 这意味着您需要从任何类型到MyError的转换才能实现所需的功能:

impl<T> From<T> for MyError {
    fn from(e: T) -> MyError {
        MyError::Parse
    }
}

但是,一致性规则不允许此实现-与标准库中任何类型TFrom<T>的实现冲突。 即使允许这种实现,它也不会真正做您想要的事情– 任何错误类型都将转换为MyError::Parse ,而不仅仅是解析错误。

一种可能的解决方法是为解析错误类型引入标记特征:

trait ParseError {}

impl<T: ParseError> From<T> for MyError {
    fn from(e: T) -> MyError {
        MyError::Parse
    }
}

然后,您可以为所有解析错误类型实现此标记特征:

impl ParseError for std::str::ParseBoolError {}
impl ParseError for std::num::ParseFloatError {}
impl ParseError for std::num::ParseIntError {}
impl ParseError for std::net::AddrParseError {}
impl ParseError for std::char::ParseCharError {}

如果仍然要丢弃解析错误,请使用map_err在本地更改错误:

fn process<R: FromStr>(s: &str) -> Result<(), MyError> {
    let _ = s.parse::<R>().map_err(|_| MyError::Parse)?;
    Ok(())
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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