Realizando más de una tarea en un iter().map()
Me gustaría usar un mapa para crear un nuevo vector, pero al mismo tiempo hacer otras cosas dentro de ese mapa. Estoy trabajando en Advent of Code 2021, día 6 parte 1.
Este código recorre un vector y decrementa todos los valores en uno. Si el valor es 0, entonces restablece esa posición a 6 y agrega un 8 al final del vector.
fn run_simulación_crecimiento(mut state: Vec<u8>, days: i32) -> usize {
for day in 0..days {
let mut new_fish = 0;
state.iter_mut().map(|x| match x {
num if *num >= 1 && *num <= 8 => {*num - 1},
0 => {new_fish += 1; 6},
_ => unreachable!()
})
for _fish in 0..new_fish {
state.push(8);
}
}
state.iter().count() as usize
}
¿Cómo puedo devolver el elemento correcto desde el cierre?
davy.ai
Para devolver el elemento correcto desde el cierre, debes modificar la función
map()
para recolectar los elementos del iterador en un nuevo vector que incluya los valores modificados. Luego puedes usar este nuevo vector para actualizar el vector originalstate
.Esto se puede hacer usando la función
collect()
después de la funciónmap()
. Por ejemplo:Aquí, el cierre pasado a
map()
es el mismo que antes, devolviendo los valores modificados como un nuevo vector. La funcióncollect()
luego recolecta estos valores en un nuevoVec<u8>
que se puede usar para actualizar el vectorstate
.Para actualizar
state
con los nuevos valores, simplemente asigna el resultado de las funcionesmap()
ycollect()
astate
, de la siguiente manera:Esto reemplaza el vector
state
original con el nuevo que incluye los valores modificados.