Menu
Coddy logo textTech

A Struct Screen

Parte da seção Programação Orientada a Objetos do Journey de Rust da Coddy. Lição 52 de 61.

challenge icon

Desafio

Fácil

Agora é hora de reunir todos os seus componentes de UI! Você criará uma struct Screen que pode conter uma coleção de diferentes componentes desenháveis usando objetos de trait. É aqui que o poder de Vec<Box<dyn Draw>> realmente se destaca: uma coleção que gerencia vários tipos de componentes.

Você adicionará um novo módulo ao seu projeto em crescimento:

  • draw.rs: Seu trait Draw dos desafios anteriores.
  • text_field.rs: Seu componente TextField que imprime Text: {content}.
  • button.rs: Seu componente Button que imprime Button: {label} (width: {width}).
  • screen.rs: Crie uma struct Screen que contenha um campo público components do tipo Vec<Box<dyn Draw>>. Implemente uma função associada new que crie uma tela vazia e um método add que receba um Box<dyn Draw> e o adicione ao vetor de componentes.
  • main.rs: Reúna todos os módulos. Crie uma Screen, adicione um TextField e um Button a ela, depois percorra os componentes da tela e chame draw() em cada um.

Sua Screen precisa armazenar objetos de trait, então você usará a palavra-chave dyn com seu trait Draw. O método add deve receber &mut self, pois ele modifica o vetor de componentes.

As seguintes entradas serão fornecidas:

  • Primeira linha: o conteúdo do campo de texto
  • Segunda linha: o rótulo do botão
  • Terceira linha: a largura do botão (como um número)

Sua saída deve exibir cada componente em sua própria linha, na ordem em que foram adicionados:

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

Experimente você mesmo

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: Crie um Screen usando Screen::new()
    // TODO: Adicione um TextField envolvido em Box::new() à screen
    // TODO: Adicione um Button envolvido em Box::new() à screen
    // TODO: Itere sobre screen.components e chame draw() em cada componente
}

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Rust online