我想编写一个函数,接受一组标记列表。但是我在使其足够通用以处理两个非常类似的调用时遇到了问题:
let s = String::from("-abc -d --echo");
parse( s.split_ascii_whitespace() );
parse( std::env::args() );
String::split_ascii_whitespace()
返回实现Iterator<Item=&'a str>
的std::str::SplitAsciiWhitespace
。std::env::args()
返回实现Iterator<Item=String>
的std::env::Args
。
是否有办法写出一个函数签名,既可以接受 split_ascii_whitespace()
方法,也可以接受 args()
方法?
我的解决方案现在需要复制函数体:
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),
}
}
}
如果不可能的话,那么关于如何使用特质使函数可以使用相同的名称的建议会很好。
fn parse(mut it: impl Iterator<Item = impl AsRef<str>>)
。 - user4815162342