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

How do I define trait bounds on an associated type?

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

我的想法:

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"),
    }
}

是的,您可以使用 where 子句来做到这一点:

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

或者,由于此处 Item 的含义很明确,因此界限可以是:

where T::Item: ToString

您可以使用 Item = syntax:

fn parse<I: ToString, T: Iterator<Item = I>>(mut args: T) -> Result<String, String>

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

fn parse<T: Iterator<Item = impl ToString>>(mut args: T) -> Result<String, String>

最后:

fn parse(mut args: impl Iterator<Item = impl ToString>) -> Result<String, String>

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