Rust String 与 &str 迭代器

标签 rust iterator traits

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

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

parse( s.split_ascii_whitespace() );
parse( std::env::args() );
  • String::split_ascii_whitespace() 返回 std::str:SplitAsciiWhitespace实现 Iterator<Item=&'a str> .
  • std::env::args() 返回 std::env::Args实现 Iterator<Item=String> .

  • 有没有办法让我为 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),
            }
        }
    }
    
    如果不可能,那么一些关于如何使用特征以便函数可以使用相同名称的建议会很好。

    最佳答案

    您可以要求项目类型为 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()),
            }
        }
    }
    

    关于Rust String 与 &str 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63150794/

    相关文章:

    iterator - 找出闭包的返回类型

    rest - rust 诗-openapi : endpoints in multiple files

    rust - 如何记录二进制 Rust crate 项目?

    Rust 文件示例无法编译

    c++ - upper_bound() 给出了错误的输出

    rust - 如何使用迭代器和范围创建阶乘的非递归计算?

    c++ - 将列表迭代器存储为成员

    c++ - 标签 dispatching/enable_if - 我很困惑

    generics - 了解Rust中的通用FromIterator

    generics - 为什么在具有泛型类型参数的结构定义中使用特征边界?