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 multimedia