【发布时间】:2020-11-18 21:04:17
【问题描述】:
我正在尝试编写一个接受令牌列表的函数。但是我在使它足够通用以处理两个非常相似的调用时遇到了问题:
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。
我有没有办法为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),
}
}
}
如果不可能,那么一些关于如何使用特征以便函数可以使用相同名称的建议会很好。
【问题讨论】: