Recapitulação - Impressora Genérica
Parte da seção Object Oriented Programming do Journey de Rust da Coddy — lição 44 de 61.
Desafio
FácilVamos construir um sistema de anúncios flexível que demonstra o poder dos trait bounds! 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 aceita qualquer tipoTque implementePrintable. Esta função deve imprimir"Announcement: {info}"onde{info}é o resultado da chamada deprint_info()no item.main.rs: Crie duas structs públicas que implementamPrintable:Person— com um campo públiconame(String). Seuprint_infodeve retornar"Person: {name}"Product— com campos públicosname(String) eprice(f64). Seuprint_infodeve retornar"Product: {name} - ${price}"
announcecom cada um para demonstrar que sua função genérica funciona com qualquer tipoPrintable.
A beleza deste design é que announce não se importa se recebe um Person, Product ou qualquer tipo futuro—ele apenas exige que o tipo possa fornecer informações através de print_info(). O trait bound garante isso em tempo de compilação.
Sua saída deve mostrar ambos os 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 (analise como f64).
Experimente você mesmo
mod printable;
use printable::{Printable, announce};
// TODO: Defina uma struct pública Person com um campo público name (String)
// Implemente a 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 a trait Printable para Product
// print_info deve retornar "Product: {name} - ${price}"
fn main() {
// Ler 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: Criar uma instância de Person com person_name
// TODO: Criar uma instância de Product com product_name e price
// TODO: Chamar announce com a Person
// TODO: Chamar announce com o Product
}
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