如何表达绑定在另一个泛型类型的特征绑定的类型参数上的特征?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (34)

试图通过添加一个类型变量来代替具体类型来改进一些现有代码,使其更加通用。

原始代码如下所示:

fn parse_row(text: String) -> Result<Vec<u32>, String> {
    text.split(" ")
        .map(|s| s.to_owned()
            .parse::<u32>()
            .map_err(|e| e.to_string())
        )
        .collect()
}

这是通用版本:

fn parse_row<T>(text: String) -> Result<Vec<T>, String>
    where T: Copy + Debug + FromStr + Display
{
    text.split(" ")
        .map(|s| s.to_owned()
            .parse::<T>()
            .map_err(|e| e.to_string())
        )
        .collect()
}

我得到的错误是:

error[E0599]: no method named `to_string` found for type `<T as std::str::FromStr>::Err` in the current scope
 --> src/main.rs:7:28
  |
7 |             .map_err(|e| e.to_string())
  |                            ^^^^^^^^^
  |
  = note: the method `to_string` exists but the following trait bounds were not satisfied:
          `<T as std::str::FromStr>::Err : std::string::ToString`

<T as core::str::FromStr>::Err指的是与相关联的类型参数TFromStr实现。怎么能表达这种类型?

提问于
用户回答回答于

我不明白Err指的是哪一个 - 并且认为它是错误类型参数Result。一旦我发现FromStr有自己的Err类型参数,只需要研究如何表达这个约束。这里是:

fn parse_row<T, E>(text: String) -> Result<Vec<T>, String>
    where
        T: Copy + Debug + FromStr,
        T::Err: Display
{
    text.split(" ")
        .map(|s| s.to_owned()
            .parse::<T>()
            .map_err(|e| e.to_string())
        )
        .collect()
}

所属标签

可能回答问题的人

  • 富有想象力的人

    4 粉丝0 提问6 回答
  • 不吃貓的鱼oo

    5 粉丝466 提问6 回答
  • 人生的旅途

    10 粉丝484 提问6 回答
  • Richel

    8 粉丝0 提问4 回答

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励