Ejecución de la pantalla
Parte de la sección Programación Orientada a Objetos del Journey de Rust de Coddy. Lección 53 de 61.
Desafío
Fácil¡Felicidades por llegar al paso final del proyecto Sistema de documentos! Has creado todas las piezas individuales: el trait Draw, TextField, Button y Screen. Ahora es momento de darle a tu Screen la capacidad de renderizar todos sus componentes a la vez con una sola llamada a un método.
Completarás tu proyecto añadiendo un método run a la estructura Screen. Este método iterará por todos los componentes almacenados en la pantalla y llamará a draw() en cada uno, dando vida a todo tu sistema de documentos.
Los archivos de tu proyecto:
draw.rs: Tu traitDrawcon el métododraw.text_field.rs: Tu componenteTextFieldque imprimeText: {content}.button.rs: Tu componenteButtonque imprimeButton: {label} (width: {width}).screen.rs: Tu estructuraScreencon los métodosnewyadd. Añade un métodorunque reciba&selfy llame adraw()en cada componente de la colección.main.rs: Une todo: crea unScreen, añade tus componentes y llama arun()para renderizar toda la pantalla de una sola vez.
El método run encapsula la lógica de renderizado dentro de Screen, lo que hace que tu función principal sea clara y sencilla. En lugar de iterar manualmente por los componentes en main, solo tienes que llamar a screen.run().
Se proporcionarán las siguientes entradas:
- Primera línea: el contenido del campo de texto
- Segunda línea: la etiqueta del botón
- Tercera línea: el ancho del botón (como número)
Tu salida debe mostrar cada componente en su propia línea, en el orden en que se añadieron:
Text: Dashboard
Button: Save (width: 120)Pruébalo tú mismo
mod draw;
mod text_field;
mod button;
mod screen;
use draw::Draw;
use text_field::TextField;
use button::Button;
use screen::Screen;
pub struct Label {
pub text: String,
}
impl Draw for Label {
fn draw(&self) {
println!("{}", self.text);
}
}
fn main() {
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let content = input1.trim().to_string();
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let label = input2.trim().to_string();
let mut input3 = String::new();
std::io::stdin().read_line(&mut input3).expect("Failed to read line");
let width: u32 = input3.trim().parse().expect("Failed to parse width");
let mut screen = Screen::new();
let text_field = TextField { content };
screen.add(Box::new(text_field));
let button = Button { label, width };
screen.add(Box::new(button));
// TODO: Reemplaza la iteración manual de abajo con una sola llamada a screen.run()
for component in &screen.components {
component.draw();
}
}Todas las lecciones de Programación Orientada a Objetos
1Métodos y Comportamiento
Intro a Bloques de ImplementaciónEl Parámetro SelfMétodos MutablesFunciones AsociadasMúltiples Bloques de ImplementaciónEncadenamiento de MétodosResumen - Acciones de Rectángulo4Proyecto: Mascota virtual
Definir la mascotaAlimentar a la mascota7Traits estándar
El trait DebugEl trait DisplayClone y CopyTraits de igualdadResumen - Punto imprimible10Proyecto: Sistema de documentos
El Trait DrawComponente de texto2Encapsulamiento y módulos
Conceptos básicos de módulosLa palabra clave PublicCampos privadosGettersSettersRepaso - Casillero seguro5Genéricos
Estructuras genéricasMétodos genéricosMúltiples tipos genéricosFunciones genéricasResumen - Punto de coordenadas8Traits como límites
Sintaxis de límites de traitsLímites múltiplesLa cláusula whereRetornar tipos con traitsResumen: Impresora genérica11Patrones de diseño en Rust
Patrón NewtypeComposiciónEl Trait DropFrom e IntoResumen - Mock de Smart Pointer3Enums avanzados
Enums con datosMétodos en EnumsCoincidencia de variantes de datosEl Enum Option revisitadoResumen - Enum Shape6Definición de Traits
¿Qué es un Trait?Implementación de TraitsImplementaciones por defectoSobrescribir valores por defectoTraits con parámetrosResumen - Reproductor multimediaPractica por tu cuenta: Compilador de Rust online