我正在尝试编写一个接受 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>
,这将包括 &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()),
}
}
}
关于Rust String 与 &str 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63150794/