如何在关联类型中定义特质约束?

16
我希望编写一个函数,它能够接受实现了 ToString trait 的类型的 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"),
    }
}
2个回答

22

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

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

或者,由于这里指的Item是明确的,所以绑定可以直接为:

where T::Item: ToString

1
谢谢!<T as Iterator>::Item 这部分叫什么?我无法在谷歌上找到它,因为我可能缺少正确的术语。 - nothrow
1
那个部分本身没有名称(我认为),但是 T::Item: ToString 被称为 bound 或者 _trait bound_。你也可能会看到它被称为 _constraint_。 - Peter Hall

13
您可以使用“Item =”语法:关联类型
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>

我认为这是一种更易读的替代方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接