我想将一个采用某种类型的任意迭代器的函数(例如下面示例中的
String
)传递到另一个函数中,但我不知道如何指定此类函数的类型。
这是我想要实现的目标的最小(非工作)示例。编译器无法推断
I
的类型。
fn process<I>(lines: I)
where
I: Iterator<Item = String>, // or IntoIterator
{
for line in lines {
println!("{}", line.to_uppercase());
}
}
fn run<F, I>(processor: F)
where
I: Iterator<Item = String>,
F: Fn(I),
{
let v = vec![
String::from("aaa"),
String::from("BBB"),
String::from("cCcC"),
];
processor(v.iter());
}
fn main() {
run(process);
}
run
没有传递任何 Iterator<Item = String>
,它当前正在传递一个非常具体的 std::slice::Iter<'_, String>
,因此您不能在其上使用通用的 I: Iterator
。无论如何,slice::Iter<'_, String>
实现了Iterator<Item = &String>
而不是Iterator<Item = String>
(注意附加/不存在的&
),所以process
甚至不接受它。
你可能想写这个:
fn process<I>(lines: I)
where
I: Iterator<Item = String>, // or IntoIterator
{
for line in lines {
println!("{}", line.to_uppercase());
}
}
fn run<F>(processor: F)
where
F: Fn(std::vec::IntoIter<String>),
{
let v = vec![
String::from("aaa"),
String::from("BBB"),
String::from("cCcC"),
];
processor(v.into_iter());
}
fn main() {
run(process);
}