如何在关联类型上定义特征范围?

时间:2019-01-18 16:48:18

标签: rust traits 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"),
    }
}

2 个答案:

答案 0 :(得分:3)

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

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

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

where T::Item: ToString

答案 1 :(得分:1)

您可以使用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>

我认为这是一种更具可读性的选择。