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 vetor = vec![10, 20];
    vetor.push(30);
    let ponto_central = vetor.len() / 2;
    println!("valor do meio: {}", vetor[ponto_central]);
    for item in vetor.iter() {
        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 Biblioteca {
    livros: Vec<Livro>,
}

struct Livro {
    titulo: String,
    ano: u16,
}

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

// 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 Biblioteca {
    fn new() -> Biblioteca {
        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 biblioteca = Biblioteca::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