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

问题描述 投票:0回答:3

我想编写一个函数,接受具有

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"),
    }
}
rust traits associated-types
3个回答
24
投票

是的,您可以使用

where
子句来做到这一点:

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

或者,由于这里

Item
的含义是明确的,因此界限可以是:

where T::Item: ToString

15
投票

您可以使用

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>

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


0
投票

从 Rust 1.79 开始,您可以将绑定直接放置在关联的

Item
类型上,因此您可以像这样定义
parse()

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

甚至像这样:

fn parse(mut args: impl Iterator<Item: ToString>) -> Result<String, String> {
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.