Armazenando Livros

Nós iremos aprender muito mais sobre structs e o tipo Vec<T> amanhã. Por hora, você só precisa conhecer parte de sua API:

fn main() {
    let mut vec = vec![10, 20];
    vec.push(30);
    let midpoint = vec.len() / 2;
    println!("valor do meio: {}", vec[midpoint]);
    for item in &vec {
        println!("item: {item}");
    }
}

Use isto para modelar uma coleção de livros de uma biblioteca. Copie o código abaixo para https://play.rust-lang.org/ e atualize os tipos para compilar:

struct Library {
    books: Vec<Book>,
}

struct Book {
    title: String,
    year: u16,
}

impl Book {
    // Este é um construtor, utilizado abaixo.
    fn new(title: &str, year: u16) -> Book {
        Book {
            title: String::from(title),
            year,
        }
    }
}

// Implemente os métodos abaixo. Atualize o parâmetro `self` para
// indicar o nível requerido de ownership sobre o objeto:
//
// - `&self` para acesso compartilhado de apenas leitura,
// - `&mut self` para acesso mutável exclusivo,
// - `self` para acesso exclusivo por valor.
impl Library {
    fn new() -> Library {
        todo!("Inicialize e retorne um valor `Biblioteca`")
    }

    //fn tamanho(self) -> usize {
    //    todo!("Retorne o tamanho de `self.livros`")
    //}

    //fn esta_vazia(self) -> bool {
    //    todo!("Retorne `true` se `self.livros` for vazio")
    //}

    //fn adicionar_livro(self, book: Livro) {
    //    todo!("Adicione um novo livro em `self.livros`")
    //}

    //fn imprimir_livros(self) {
    //    todo!("Itere sobre `self.livros` e sobre o título e ano de cada livro")
    //}

    //fn livro_mais_antigo(self) -> Option<&Livro> {
    //    todo!("Retorne uma referência para o livro mais antigo (se houver)")
    //}
}

// Isto demonstra o comportamento esperado. Descomente o código abaixo e
// implemente os métodos que faltam. Você precisará atualizar as
// assinaturas dos métodos, incluindo o parâmetro "self"! Você talvez
// precise atualizar as atribuições de variável dentro de `main()`.
fn main() {
    let library = Library::new();

    //println!("A biblioteca está vazia: biblioteca.esta_vazia() -> {}", biblioteca.esta_vazia());
    //
    //biblioteca.adicionar_livro(Livro::new("Lord of the Rings", 1954));
    //biblioteca.adicionar_livro(Livro::new("Alice's Adventures in Wonderland", 1865));
    //
    //println!("The biblioteca não está mais vazia: biblioteca.esta_vazia() -> {}", biblioteca.esta_vazia());
    //
    //
    //biblioteca.imprimir_livros();
    //
    //match biblioteca.livro_mais_antigo() {
    //    Some(livro) => println!("O livro mais antigo é {}", livro.titulo),
    //    None => println!("A biblioteca está vazia!"),
    //}
    //
    //println!("The biblioteca tem {} livros", biblioteca.tamanho());
    //biblioteca.imprimir_livros();
}

Soluções