Recapitulação - Impressora Genérica
Parte da seção Programação Orientada a Objetos do Journey de Rust da Coddy. Lição 44 de 61.
Desafio
FácilVamos criar um sistema de anúncios flexível que demonstra o poder dos limites de traits! Você criará uma trait Printable e uma função genérica que pode anunciar qualquer tipo que implemente essa trait, mostrando como genéricos e traits trabalham juntos para criar código reutilizável e seguro quanto aos tipos.
Você organizará seu código em dois arquivos:
printable.rs: Defina uma trait públicaPrintablecom um métodoprint_infoque recebe&selfe retorna umaString. Em seguida, crie uma função genérica pública chamadaannounceque aceite qualquer tipoTque implementePrintable. Essa função deve imprimirAnnouncement: {info}, em que{info}é o resultado da chamada deprint_info()no item.main.rs: Crie duas structs públicas que implementemPrintable:Person: com um campo públiconame(String). Seuprint_infodeve retornarPerson: {name}Product: com campos públicosname(String) eprice(f64). Seuprint_infodeve retornarProduct: {name} - ${price}
announcecom cada um deles para demonstrar que sua função genérica funciona com qualquer tipoPrintable.
A beleza desse design é que announce não se importa se recebe uma Person, Product ou qualquer tipo futuro. Ela exige apenas que o tipo possa fornecer informações por meio de print_info(). O limite da trait garante isso em tempo de compilação.
Sua saída deve mostrar os dois anúncios:
Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}Por exemplo, com as entradas Alice, Laptop e 999.99:
Announcement: Person: Alice
Announcement: Product: Laptop - $999.99Você receberá três entradas: o nome da pessoa, o nome do produto e o preço do produto (converta para f64).
Experimente você mesmo
mod printable;
use printable::{Printable, announce};
// TODO: Defina uma struct pública Person com um campo name público (String)
// Implemente o trait Printable para Person
// print_info deve retornar "Person: {name}"
// TODO: Defina uma struct pública Product com campos públicos name (String) e price (f64)
// Implemente o trait Printable para Product
// print_info deve retornar "Product: {name} - ${price}"
fn main() {
// Leia as entradas
let mut person_name = String::new();
std::io::stdin().read_line(&mut person_name).expect("Failed to read line");
let person_name = person_name.trim().to_string();
let mut product_name = String::new();
std::io::stdin().read_line(&mut product_name).expect("Failed to read line");
let product_name = product_name.trim().to_string();
let mut price_input = String::new();
std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
let price: f64 = price_input.trim().parse().expect("Failed to parse price");
// TODO: Crie uma instância de Person com person_name
// TODO: Crie uma instância de Product com product_name e price
// TODO: Chame announce com o Person
// TODO: Chame announce com o Product
}
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