Catálogo de Biblioteca
Parte da seção Object Oriented Programming do Journey de Rust da Coddy — lição 60 de 61.
Desafio
FácilVamos construir um sistema de catálogo de biblioteca que demonstra como as traits unificam diferentes tipos sob uma interface comum! Você criará um catálogo onde livros e revistas — apesar de terem propriedades diferentes — podem todos se descrever através de uma trait compartilhada.
Você organizará seu código em três arquivos:
catalog.rs: Defina a traitCatalogItemcom um único métododescriptionque retorna umaString. Esta trait estabelece o contrato que todos os itens da biblioteca devem cumprir.items.rs: Crie duas structs que implementam sua trait. UmBookpossui umtitleeauthor(ambos Strings), enquanto umMagazinepossui umname(String) e um número deissue(u32). Cada struct deve implementarCatalogItemcom seu próprio formato de descrição exclusivo.main.rs: Importe ambos os módulos e crie instâncias de Book e Magazine usando as entradas fornecidas. Chame o métododescriptionem cada item e imprima os resultados.
Sua descrição de Book deve seguir este formato:
Book: {title} by {author}Sua descrição de Magazine deve seguir este formato:
Magazine: {name}, Issue {issue}Por exemplo, com as entradas 1984, George Orwell, Nature, e 42:
Book: 1984 by George Orwell
Magazine: Nature, Issue 42E com as entradas The Rust Book, Steve Klabnik, Science Weekly, e 156:
Book: The Rust Book by Steve Klabnik
Magazine: Science Weekly, Issue 156Você receberá quatro entradas: título do livro, autor do livro, nome da revista e número da edição da revista (converta o último para u32).
Experimente você mesmo
mod catalog;
mod items;
use catalog::CatalogItem;
use items::{Book, Magazine};
fn main() {
// Ler as entradas
let mut book_title = String::new();
std::io::stdin().read_line(&mut book_title).expect("Failed to read line");
let book_title = book_title.trim().to_string();
let mut book_author = String::new();
std::io::stdin().read_line(&mut book_author).expect("Failed to read line");
let book_author = book_author.trim().to_string();
let mut magazine_name = String::new();
std::io::stdin().read_line(&mut magazine_name).expect("Failed to read line");
let magazine_name = magazine_name.trim().to_string();
let mut issue_input = String::new();
std::io::stdin().read_line(&mut issue_input).expect("Failed to read line");
let magazine_issue: u32 = issue_input.trim().parse().expect("Failed to parse issue number");
// TODO: Criar uma instância de Book usando book_title e book_author
// TODO: Criar uma instância de Magazine usando magazine_name e magazine_issue
// TODO: Chamar description() em cada item e imprimir os resultados
}
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