Ejecución de la pantalla
Parte de la sección Object Oriented Programming del Journey de Rust de Coddy. Lección 53 de 61.
Desafío
Fácil¡Felicitaciones por llegar al paso final del proyecto del Sistema de Documentos! Has construido todas las piezas individuales: el trait Draw, TextField, Button y Screen. Ahora es el 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 agregando un método run a la estructura Screen. Este método iterará a través de todos los componentes almacenados en la pantalla y llamará a draw() en cada uno, dando vida a todo tu sistema de documentos.
Tus archivos del proyecto:
draw.rs: Tu traitDrawcon el métododraw.text_field.rs: Tu componenteTextFieldque imprime"Text: {}".button.rs: Tu componenteButtonque imprime"Button: {} (width: {})".screen.rs: Tu estructuraScreencon los métodosnewyadd. Agrega un métodorunque tome&selfy llame adraw()en cada componente de la colección.main.rs: Une todo: crea unaScreen, agrega 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, haciendo que tu función principal sea limpia y sencilla. En lugar de iterar manualmente a través de los componentes en main, simplemente llamas a screen.run().
Se proporcionarán las siguientes entradas:
- Primera línea: el contenido del campo de texto (text field)
- Segunda línea: la etiqueta del botón (button's label)
- Tercera línea: el ancho del botón (como un número)
Tu salida debe mostrar cada componente en su propia línea, en el orden en que fueron agregados:
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: Reemplazar la iteración manual de abajo con una sola llamada a screen.run()
for component in &screen.components {
component.draw();
}
}Todas las lecciones de Object Oriented Programming
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