gpt4 book ai didi

Rust String 与 &str 迭代器

转载 作者:行者123 更新时间:2023-12-03 11:24:30 28 4
gpt4 key购买 nike

我正在尝试编写一个接受 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/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com