我想将一个对某种类型(例如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>
notIterator<Item = String>
(注意 extra/absent&
),所以process
甚至不接受它。你可能想写这个:
或这个替代方案
run
: