Menu
Coddy logo textTech

El Struct Screen

Parte de la sección Programación Orientada a Objetos 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 puede contener una colección de diferentes componentes dibujables mediante objetos de trait. Aquí es donde realmente brilla el poder de Vec<Box<dyn Draw>>: una colección que administra varios tipos de componentes.

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

  • draw.rs: Tu trait Draw de los desafíos anteriores.
  • text_field.rs: Tu componente TextField que imprime Text: {content}.
  • button.rs: Tu componente Button que imprime Button: {label} (width: {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 un Screen, añade un TextField y un Button y, después, recorre los componentes de la pantalla y llama a draw() en cada uno.

Tu Screen necesita almacenar objetos de trait, así que usarás la palabra clave dyn con tu trait 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
  • 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: Hello
Button: Click Me (width: 80)
FORMATO DE SALIDA REQUERIDO: [Tu contenido traducido aquí]

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: Crea un Screen usando Screen::new()
    // TODO: Añade un TextField envuelto en Box::new() a la screen
    // TODO: Añade un Button envuelto en Box::new() a la screen
    // TODO: Itera sobre screen.components y llama a draw() en cada componente
}

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Rust online