Quero passar uma função que utiliza um iterador arbitrário de algum tipo (por exemplo, String
no exemplo abaixo) para outra função, mas não sei como especificar o tipo dessa função.
Aqui está um exemplo mínimo (não funcional) do que estou tentando alcançar. O compilador não pode inferir o tipo de 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
não está passando nada,Iterator<Item = String>
está passando um muito específicostd::slice::Iter<'_, String>
, então você não pode ter um genéricoI: Iterator
nele. De qualquer formaslice::Iter<'_, String>
, implementaIterator<Item = &String>
notIterator<Item = String>
(observe o adicional/ausente&
), entãoprocess
nem aceita.Você provavelmente quis escrever isto:
ou esta alternativa
run
: