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

时间:2015-11-28 21:49:09

标签: generics rust traits

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

原始代码如下所示:

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指的是与T的{​​{1}}实现相关联的类型参数,但我怎样才能表达这种类型 - 我实际上无法知道 - 具有{ {1}}特质?

1 个答案:

答案 0 :(得分:4)

这最初令人困惑,因为我不明白它引用了哪个Err,并认为它是Result的错误类型参数。一旦我发现FromStr有自己的Err类型参数,我就必须弄清楚如何表达这种约束。这是:

fn parse_row<T>(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()
}