Executando a Tela
Parte da seção Object Oriented Programming do Journey de Rust da Coddy — lição 53 de 61.
Desafio
FácilParabéns por chegar à etapa final do projeto do Sistema de Documentos! Você construiu todas as peças individuais — a trait Draw, TextField, Button e Screen. Agora é hora de dar à sua Screen a capacidade de renderizar todos os seus componentes de uma só vez com uma única chamada de método.
Você completará seu projeto adicionando um método run à struct Screen. Este método percorrerá todos os componentes armazenados na tela e chamará draw() em cada um, dando vida a todo o seu sistema de documentos.
Seus arquivos de projeto:
draw.rs: Sua traitDrawcom o métododraw.text_field.rs: Seu componenteTextFieldque imprime"Text: {}".button.rs: Seu componenteButtonque imprime"Button: {} (width: {})".screen.rs: Sua structScreencom os métodosneweadd. Adicione um métodorunque recebe&selfe chamadraw()em cada componente da coleção.main.rs: Reúna tudo — crie umaScreen, adicione seus componentes e chamerun()para renderizar a tela inteira de uma só vez.
O método run encapsula a lógica de renderização dentro da Screen, tornando sua função principal limpa e simples. Em vez de iterar manualmente pelos componentes em main, você apenas chama screen.run().
As seguintes entradas serão fornecidas:
- Primeira linha: o conteúdo do campo de texto (text field)
- Segunda linha: o rótulo (label) do botão
- Terceira linha: a largura (width) 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: Dashboard
Button: Save (width: 120)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");
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: Substitua a iteração manual abaixo por uma única chamada para screen.run()
for component in &screen.components {
component.draw();
}
}Todas as lições de Object Oriented Programming
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 Player