Imprimir con formatos
La impresión se maneja por una serie de macros definida enstd::fmt algunos de los cuales son:
format!: escribe el texto formateado a unStringprint!: igual queformat!pero el texto se imprime a la consola (io::stdout).println!: es igual queprint!pero se agrega un salto de líneaeprint!: igual queprint!pero el texto se imprime al error estándar (io::stderr).eprintln!: es igual queeprint!pero se agrega un salto de línea
All parse text in the same fashion. As a plus, Rust checks formatting correctness at compile time.
fn main() { // In general, the `{}` will be automatically replaced with any // arguments. These will be stringified. println!("{} días", 31); // Se pueden usar argumentos posicionales. Especificar un entero dentro de `{}` // determina qué argumento adicional será reemplazado. Los argumentoscomienzan // en 0 inmediatamente después de la cadena de formato. println!("{0}, esto es {1}. {1}, este es {0}", "Alice", "Bob"); // Como los argumentos nombrados. println!("{sujeto} {verbo} {objeto}", object="the lazy dog", subject="the quick brown fox", verb="jumps over"); // Se puede invocar diferentes formatos especificando el carácter del formato // después de un `:`. println!("Base 10: {}", 69420); // 69420 println!("Base 2 (binario): {:b}", 69420); // 10000111100101100 println!("Base 8 (octal): {:o}", 69420); // 207454 println!("Base 16 (hexadecimal): {:x}", 69420); // 10f2c // Puedes justificar el texto a la derecha con un ancho especificado. Esto será // salida " 1 ". (Cuatro espacios blancos y un "1", para un ancho totalde 5.) println!("{numero:>5}", number=1); // Puedes rellenar números con ceros adicionales, println!("{numero:0>5}", number=1); // 00001 // y justificar a la izquierda volteando el signo. Esto imprimirá "10000". println!("{numero:0<5}", number=1); // 10000 // Puede usar argumentos con nombre en el formato especificador agregando un `$`. println!("{numero:0>ancho$}", number=1, width=5); // Rust incluso verifica para asegurarse de que se usen el número correcto de argumentos. println!("Mi nombre es {0}, {1} {0}", "Bond"); // FIXME ^ Add the missing argument: "James" // Sólo los tipos que implementan `fmt::Display` pueden formatearse con `{}`. // Los tipos definidos por usuario no implementan `fmt::Display` de forma predeterminada. #[allow(dead_code)] // deshabilita `dead_code` el cual advierte contra módulos no usados struct Structure(i32); // Esto no se compilará porque `Structure` no implementa // `fmt::Display`. // println!("esta estructura `{}` no va a imprimir... ", Structure(3)); // TAREA ^ intente quitar el comentario de esta línea // Para Rust 1.58 y superior, puedes capturar directamente el argumento de una // variable en el entorno. Al igual que lo anterior, esto imprimirá // " 1", 4 espacios blancos y a "1". let number: f64 = 1.0; let width: usize = 5; println!("{numero:>ancho$}"); }
std::fmt contiene muchos traits que rigen la visualización de texto. La forma básica de dos de ellos se enumera a continuación:
fmt::Debug: Usa el marcador{:?}. Formatea el texto para fines de depuración.fmt::Display: Usa el marcador{}. Formatea texto de una manera más elegante y amistosa.
Aquí, usamos fmt::Display porque la librería std proporciona implementaciones para estos tipos. Para imprimir tipos personalizados, más pasosson necesarios
Implementar el rasgo fmt::Display implementa automáticamente el trait ToString que nos permite convertir el tipo en String.
En la línea 43,#[allow(dead_code)] es un [atributo](../ attribute.md) quesolo se aplica al módulo después de él.
Actividades
- Solucione el problema en el código anterior (ver el ARRÉGLAME) para que se ejecute sin error.
- Intente quitar el comentario de la línea que intenta formatear la estructura
Structure(ver TAREA) - Agregue un macro
println!que imprima:Pi es aproximadamente 3.142controlando el número de decimales mostrados. Para efectos de esteejercicio, uselet Pi = 3.141592como una estimación para pi. (Sugerencia: puedesconsultar la documentación destd::fmtpara configurar el número de decimales desplegados)