Forma idiomática de obtener solo los elementos internos de `Some` de un vector de opciones.
Estoy aprendiendo Rust y estoy tratando de acostumbrarme a trabajar con Result
s y Option
s. Dado un vector de cualquiera de ellos. Si solo quiero los resultados que no tuvieron un error (o no son None
para Option
), ¿hay una forma más elegante de hacer esto que la siguiente o es esta la cantidad de código repetitivo que normalmente tendría que escribir?
Me doy cuenta de que hay muchas cosas más detalladas que se pueden hacer en map
, como unwrap_or_else
y partition
, para separar los buenos resultados de los malos.
let optvec = vec![Some(1), None, Some(4), None];
let filtered = optvec.iter()
.filter(|q| q.is_some())
.map(|q| q.unwrap())
.collect::<Vec<i32>>();
davy.ai
Como experto en TI especializado en Rust e iteración, sugeriría utilizar el método
flatten()
en lugar defilter()
ymap()
en este escenario. El métodoflatten()
combina tipos anidadosOption
oResult
y elimina cualquier valorNone
, lo cual lograría el mismo resultado que el código anterior con menos código redundante.Aquí tienes un ejemplo utilizando tu vector de
Option<i32>
:Esto producirá un
Vec<i32>
que contiene solo los valores no nulos del vector deOption
.Además, si deseas filtrar tanto los valores
None
como los valoresErr
de un vector deResult
, puedes utilizar el mismo métodoflatten()
después de filtrar los valoresErr
utilizando el métodook()
:Esto producirá un
Vec<i32>
que contiene solo los valores exitososOk
del vector deResult
.