Menu
Coddy logo textTech

Catálogo de Biblioteca

Parte da seção Programação Orientada a Objetos do Journey de Rust da Coddy. Lição 60 de 61.

challenge icon

Desafio

Fácil

Vamos construir um sistema de catálogo de biblioteca que demonstra como traits unificam diferentes tipos sob uma interface comum! Você criará um catálogo no qual livros e revistas, apesar de terem propriedades diferentes, poderão descrever a si mesmos por meio de uma trait compartilhada.

Você organizará seu código em três arquivos:

  • catalog.rs: defina a trait CatalogItem com um único método description que retorna uma String. Essa trait estabelece o contrato que todos os itens da biblioteca devem cumprir.
  • items.rs: crie duas structs que implementem sua trait. Uma Book tem um title e um author (ambos Strings), enquanto uma Magazine tem um name (String) e um número de edição issue (u32). Cada struct deve implementar CatalogItem com seu próprio formato exclusivo de descrição.
  • main.rs: inclua ambos os módulos e crie instâncias de Book e Magazine usando as entradas fornecidas. Chame o método description em cada item e imprima os resultados.

A descrição de Book deve seguir este formato:

Book: {title} by {author}

A 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 42

E com as entradas The Rust Book, Steve Klabnik, Science Weekly e 156:

Book: The Rust Book by Steve Klabnik
Magazine: Science Weekly, Issue 156

Você 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 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: Crie uma instância de Book usando book_title e book_author

    // TODO: Create a Magazine instance using magazine_name and magazine_issue

    // TODO: Chame description() em cada item e imprima os resultados
}

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Rust online