A Struct Screen
Parte da seção Programação Orientada a Objetos do Journey de Rust da Coddy. Lição 52 de 61.
Desafio
FácilAgora é 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 traitDrawdos desafios anteriores.text_field.rs: Seu componenteTextFieldque imprimeText: {content}.button.rs: Seu componenteButtonque imprimeButton: {label} (width: {width}).screen.rs: Crie uma structScreenque contenha um campo públicocomponentsdo tipoVec<Box<dyn Draw>>. Implemente uma função associadanewque crie uma tela vazia e um métodoaddque receba umBox<dyn Draw>e o adicione ao vetor de componentes.main.rs: Reúna todos os módulos. Crie umaScreen, adicione umTextFielde umButtona ela, depois percorra os componentes da tela e chamedraw()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
1Métodos e Comportamento
Introdução a Blocos de ImplementaçãoO Parâmetro SelfMétodos MutáveisFunções AssociadasMúltiplos Blocos de ImplementaçãoEncadeamento de MétodosRecapitulação - Ações de Retângulo4Projeto: Pet Virtual
Definindo o PetAlimentando o Pet7Traits Padrão
A Trait DebugA Trait DisplayClone e CopyTraits de IgualdadeRecapitulação - Ponto Imprimível10Projeto: Sistema de Documentos
A Trait DrawComponente de Texto2Encapsulamento e Módulos
Fundamentos de MódulosA Palavra-chave PublicCampos PrivadosGettersSettersRecapitulação - Cofre Seguro5Genéricos
Structs GenéricasMétodos GenéricosMúltiplos Tipos GenéricosFunções GenéricasRecapitulação - Ponto de Coordenada8Traits como Restrições
Sintaxe de Restrições de TraitRestrições MúltiplasA Cláusula WhereRetornando Tipos com TraitsRecapitulação - Impressora Genérica11Padrões de Projeto em Rust
Padrão NewtypeComposiçãoA Trait DropFrom e IntoRecapitulação - Mock de Smart Pointer3Enums Avançados
Enums com DadosMétodos em EnumsCorrespondência de Variantes de DadosO Enum Option RevisitadoRecapitulação - Enum Shape6Definição de Traits
O que é uma Trait?Implementando TraitsImplementações PadrãoSobrescrevendo PadrõesTraits com ParâmetrosRecapitulação - Media PlayerPratique por conta própria: Compilador de Rust online