Ejemplot: Lista - Rust By Example
Description: Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.

## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# Ejemplot: Lista

Implementar `fmt::Display` para una estructura donde los elementos deben ser cada uno manejados secuencialmente es complicado. El problema es que cada `write!` genera un `fmt::Result`. El manejo adecuado de esto requiere tratar con todos losresultados. Rust proporciona el operador `?` para exactamente este propósito.

Usar `?` con `write!` se ve así:

    // Usa `write!` para ver si falla. Si hay errores, regresa
    // el error. En otro caso, continúa.
    write!(f, "{}", value)?;

Si disponemos de `?`, implementar `fmt::Display` para un `Vec` es directo:

    use std::fmt; // Importar el módulo `fmt`.

    // Define una estructura llamada `List` que contiene un `Vec`.
    struct List(Vec<i32>);

    impl fmt::Display for List {
        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
            // Extrae el valor usando indexación de tuplas,
           // y crea una referencia a `vec`.
            let vec = &self.0;

            write!(f, "[")?;

            // Iterate over `v` in `vec` while enumerating the iteration
            // index in `index`.
            for (index, v) in vec.iter().enumerate() {
                // Para cada element excepto el primero, agrega una coma.
               // Usa el operador ? para regresar errroes.
                if index != 0 { write!(f, ", ")?; }
                write!(f, "{}", v)?;
            }

            // Cierra la llave abierta y regresa un valor de `fmt::Result`.
            write!(f, "]")
        }
    }

    fn main() {
        let v = List(vec![1, 2, 3]);
        println!("{}", v);
    }

### Actividad

Intente cambiar el programa para que el índice de cada elemento en el vector seatambién impreso. La nueva salida debería verse así:

    [0: 1, 1: 2, 2: 3]

### Ver también

`for`, `ref`, `Result`, `struct`, `?`, y `vec!`