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.

¿Existe una alternativa más elegante a “.map(|x| *x)” antes de “.collect()”?

En el siguiente fragmento de código:

Rust
let b: Vec = a.iter().filter(|x| *x > 5).map(|x| *x).collect();

¿Existe alguna forma más fácil de hacer que “b” sea un vector de valores en lugar de referencias? (en lugar de “.map(|x| *x)”)

¿Existe algo así?:

Rust
fn iter_values(c: &Vec) -> std::iter::Map<std::slice::Iter, fn(&T) -> T> {
c.iter().map(|x| *x)
}

Que se pueda utilizar de esta manera:

Rust
let b: Vec = iter_values(&a).filter(|x| *x > 5).collect();

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma más elegante de hacer que b sea un vector de valores en lugar de referencias. En lugar de .map(|x| *x), puedes usar .cloned(), que crea una nueva instancia de cada elemento, clonándolos efectivamente.

    Así es como se vería el código actualizado:

    let b: Vec<usize> = a.iter().filter(|x| **x > 5).cloned().collect();
    

    En cuanto al segundo fragmento de código, parece que estás intentando implementar una función que recibe una referencia a un vector y devuelve un iterador de sus valores. Si bien tu implementación está cerca, se puede simplificar utilizando el método copied(), que es equivalente a iter().cloned().

    Así es como se vería la función actualizada:

    fn iter_values<t: copy="">(c: &Vec<t>) -> impl Iterator<item =="" t=""> + '_ {
        c.iter().copied()
    }
    

    Luego puedes usarla de la siguiente manera:

    let b: Vec<usize> = iter_values(&a).filter(|x| *x > 5).collect();
    

    Ten en cuenta que ahora estamos usando copied() en lugar de map(|x| *x) para que b sea un vector de valores en lugar de referencias.

Comments are closed.