Eu tenho este código:
let mut myFile = readFile();
let reader = BufReader::new(myFile);
let tasks = reader.lines()
.map(|line| line.expect("Couldn't read line"));
Quando passo o mouse sobre 'tarefas', vejo o seguinte:
let tasks: Map<Lines<BufReader<File>>, fn(Result<String>) -> String>
Olhando o código:
reader.lines()
fornece um iterador sobre as linhas do arquivo. map() recebe uma função/fechamento (que executa alguma ação em cada linha e retorna outro valor).
Portanto, espero que o valor de retorno map()
seja outra estrutura de dados que represente uma lista de valores.
Por que é em vez disso um Map
?
Iteradores enferrujados são preguiçosos. Quando você chama
some_iterator.lines(...).map(...)
, nenhuma iteração real é feita. Em vez disso, uma cadeia ou estrutura de "boneca russa" é configurada, onde cada iterador envolve o anterior.Todos eles começarão a ser executados quando você tentar realmente usar o resultado do iterador. Lendo-o em loop, por exemplo. Se você quiser realizar o cálculo agora e usar o resultado mais tarde, adicione um
.collect()
no final da cadeia do iterador (talvez seja necessário especificar a coleção que deseja recuperar,.collect::<Vec<_>>()
ou algo assim).