如何在关联类型上定义特征边界?

not*_*row 10 traits rust associated-types

我想编写一个接受Iterator具有ToString特征的类型的函数。

我的想法是:

fn parse<T: Iterator /* ?T::Item : ToString? */>(mut args: T) -> Result<String, String> {
    match args.next() {
        Some(x) => x.to_string(),
        None => String::from("Missing parameter"),
    }
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*all 13

是的,你可以用一个where子句做到这一点:

fn parse<T: Iterator>(mut args: T) -> Result<String, String>
where 
    <T as Iterator>::Item: ToString,
{
   // ....
}
Run Code Online (Sandbox Code Playgroud)

或者,因为这里的Item意思是明确的,所以界限可以是:

where T::Item: ToString
Run Code Online (Sandbox Code Playgroud)


Chr*_*ial 8

您可以使用以下Item =语法

fn parse<I: ToString, T: Iterator<Item = I>>(mut args: T) -> Result<String, String>
Run Code Online (Sandbox Code Playgroud)

这允许您使用以下impl语法进一步简化:

fn parse<T: Iterator<Item = impl ToString>>(mut args: T) -> Result<String, String>
Run Code Online (Sandbox Code Playgroud)

最后:

fn parse(mut args: impl Iterator<Item = impl ToString>) -> Result<String, String>
Run Code Online (Sandbox Code Playgroud)

我认为这是一个更具可读性的替代方案。