fn my_print<'a>(args: impl Iterator<Item=&'a str>) {
for arg in args {
println!("=> {}", arg);
}
}
fn main() {
let vec = vec!["one".to_string(), "two".to_string()];
my_print(vec.into_iter()); // how to pass vec here?
}
Run Code Online (Sandbox Code Playgroud)
如何转换Iterator<T>为Iterator<U>并将其传递给另一个函数?
更好的方法是以实际上并不关心的方式编写函数:
fn my_print<T: AsRef<str>>(args: impl Iterator<Item = T>) {
for arg in args {
println!("=> {}", arg.as_ref());
}
}
fn main() {
let vec = vec!["one".to_string(), "two".to_string()];
my_print(vec.into_iter()); // works!
}
Run Code Online (Sandbox Code Playgroud)
如果您不能更改函数签名,则必须事先转换迭代器:
fn my_print<'a>(args: impl Iterator<Item = &'a str>) {
for arg in args {
println!("=> {}", arg);
}
}
fn main() {
let vec = vec!["one".to_string(), "two".to_string()];
my_print(vec.iter().map(|s| s.as_ref()));
}
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下,您将无法使用,into_iter因为没人会拥有这些字符串。