我想把一个接受任意类型迭代器的函数(例如下面例子中的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);
}
字符串
1条答案
按热度按时间y0u0uwnf1#
run
没有传递任何Iterator<Item = String>
,它目前传递的是一个非常特定的std::slice::Iter<'_, String>
,所以你不能在它上面有一个通用的I: Iterator
。无论如何,slice::Iter<'_, String>
实现了Iterator<Item = &String>
而不是Iterator<Item = String>
(注意额外的/缺席的&
),所以process
甚至不接受它。你可能想写这个:
字符串
或者这个替代
run
:型