Menu
Coddy logo textTech

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.

challenge icon

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 trait Draw con el método draw.
  • text_field.rs: Tu componente TextField que imprime Text: {content}.
  • button.rs: Tu componente Button que imprime Button: {label} (width: {width}).
  • screen.rs: Tu estructura Screen con los métodos new y add. Añade un método run que reciba &self y llame a draw() en cada componente de la colección.
  • main.rs: Une todo: crea un Screen, añade tus componentes y llama a run() 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

Practica por tu cuenta: Compilador de Rust online