Menu
Coddy logo textTech

El Struct Screen

Parte de la sección Object Oriented Programming del Journey de Rust de Coddy — lección 52 de 61.

challenge icon

Desafío

Fácil

¡Ahora es el momento de reunir todos tus componentes de UI! Crearás una estructura Screen que pueda contener una colección de diferentes componentes dibujables utilizando objetos de rasgo (trait objects). Aquí es donde el poder de Vec<Box<dyn Draw>> realmente brilla: una sola colección que gestiona múltiples tipos de componentes.

Añadirás un nuevo módulo a tu proyecto en crecimiento:

  • draw.rs: Tu rasgo Draw de los desafíos anteriores.
  • text_field.rs: Tu componente TextField que imprime "Text: {}".
  • button.rs: Tu componente Button que imprime "Button: {} (width: {})".
  • screen.rs: Crea una estructura Screen que contenga un campo público components de tipo Vec<Box<dyn Draw>>. Implementa una función asociada new que cree una pantalla vacía, y un método add que reciba un Box<dyn Draw> y lo añada al vector de componentes.
  • main.rs: Reúne todos los módulos. Crea una Screen, añádele un TextField y un Button, luego itera a través de los componentes de la pantalla y llama a draw() en cada uno.

Tu Screen necesita almacenar objetos de rasgo, por lo que usarás la palabra clave dyn con tu rasgo Draw. El método add debe recibir &mut self ya que modifica el vector de componentes.

Se proporcionarán las siguientes entradas:

  • Primera línea: el contenido del campo de texto (content)
  • Segunda línea: la etiqueta del botón (label)
  • Tercera línea: el ancho del botón (width, como número)

Tu salida debe mostrar cada componente en su propia línea, en el orden en que fueron añadidos:

Text: Hello
Button: Click Me (width: 80)

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");

    // TODO: Crear un Screen usando Screen::new()
    // TODO: Añadir un TextField envuelto en Box::new() a la pantalla
    // TODO: Añadir un Button envuelto en Box::new() a la pantalla
    // TODO: Iterar sobre screen.components y llamar a draw() en cada componente
}

Todas las lecciones de Object Oriented Programming