Rust String 与 &str 迭代器

Ste*_*art 4 iterator traits rust

我正在尝试编写一个接受令牌列表的函数。但是我遇到了问题,使其足以处理两个非常相似的调用:

let s = String::from("-abc -d --echo");

parse( s.split_ascii_whitespace() );
parse( std::env::args() );
Run Code Online (Sandbox Code Playgroud)

有没有办法让我编写一个函数签名来parse接受这两种方法?

我的解决方案现在需要复制函数体:

fn main() {
    let s = String::from("-abc -d --echo");

    parse_args( s.split_ascii_whitespace() );
    parse_env( std::env::args() );
}

fn parse_env<I: Iterator<Item=String>>(mut it: I) {
    loop {
        match it.next() {
            None => return,
            Some(s) => println!("{}",s),
        }
    }
}

fn parse_args<'a, I: Iterator<Item=&'a str>>(mut it: I) {
    loop {
        match it.next() {
            None => return,
            Some(s) => println!("{}",s),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果不可能,那么一些关于如何使用特征以便函数可以使用相同名称的建议会很好。

Sve*_*ach 7

您可以要求项目类型为AsRef<str>,其中包括&strString

fn parse<I>(mut it: I)
where
    I: Iterator,
    I::Item: AsRef<str>,
{
    loop {
        match it.next() {
            None => return,
            Some(s) => println!("{}", s.as_ref()),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您喜欢参数位置中的 impl Trait(这是一个品味问题),您也可以将签名编写为 `fn parse(mut it: impl Iterator&lt;Item = impl AsRef&lt;str&gt;&gt;)`。 (2认同)