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)
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),
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果不可能,那么一些关于如何使用特征以便函数可以使用相同名称的建议会很好。
您可以要求项目类型为AsRef<str>,其中包括&str和String:
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)