es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 Results y Options. 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>>();
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Rust e iteración, sugeriría utilizar el método flatten() en lugar de filter() y map() en este escenario. El método flatten() combina tipos anidados Option o Result y elimina cualquier valor None, 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>:

    let optvec = vec![Some(1), None, Some(4), None];
    let filtered: Vec<i32> = optvec.into_iter()
        .flatten()
        .collect();
    

    Esto producirá un Vec<i32> que contiene solo los valores no nulos del vector de Option.

    Además, si deseas filtrar tanto los valores None como los valores Err de un vector de Result, puedes utilizar el mismo método flatten() después de filtrar los valores Err utilizando el método ok():

    let resultvec = vec![Ok(1), Err("error"), Ok(4), Err("another error")];
    let filtered: Vec<i32> = resultvec.into_iter()
        .filter_map(Result::ok)
        .flatten()
        .collect();
    

    Esto producirá un Vec<i32> que contiene solo los valores exitosos Ok del vector de Result.

Comments are closed.