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!