Componente de Botão
Parte da seção Object Oriented Programming do Journey de Rust da Coddy. Lição 51 de 61.
Desafio
FácilVamos continuar construindo nosso Sistema de Documentos adicionando um segundo componente de UI: um Button. Assim como o TextField, este componente implementará a trait Draw, demonstrando como diferentes tipos podem compartilhar uma interface comum.
Você expandirá seu projeto com outro arquivo de módulo:
draw.rs: Mantenha sua traitDrawdos desafios anteriores.text_field.rs: Mantenha sua structTextFielde sua implementação deDraw.button.rs: Crie uma structButtoncom dois campos públicos:label(umaString) ewidth(umu32). Implemente a traitDrawparaButtonde modo que a chamada dedraw()imprima o botão neste formato:Button: {label} (width: {width})main.rs: Importe todos os três módulos. Crie tanto umTextFieldquanto umButton, então chamedraw()em cada um para renderizar ambos os componentes.
Seu módulo button precisará acessar a trait Draw usando crate::draw::Draw, assim como você fez com TextField.
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 o campo de texto primeiro, depois o botão, cada um em sua própria linha:
Text: Welcome
Button: Submit (width: 100)Experimente você mesmo
mod draw;
mod text_field;
mod button;
use draw::Draw;
use text_field::TextField;
use button::Button;
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 text_field = TextField { content };
text_field.draw();
// TODO: Crie um Button com `label` e `width`, depois chame 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 PlayerPratique por conta própria: Compilador de Rust online