Menu
Coddy logo textTech

Marcar como Lido

Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy — lição 32 de 56.

Adicione a opção final, 4. Mark As Read. O usuário digita um título exato e o programa altera a chave :read desse livro de false para true.

Para encontrar o livro, use find: ele retorna o primeiro elemento que corresponde ao bloco, ou nil quando nada corresponde:

book = library.find { |b| b[:title] == query }

Se book for nil, informe que nenhum livro foi encontrado. Caso contrário, modifique-o no local; hashes do Ruby compartilham sua identidade dentro do array, então atualizar book[:read] atualiza a entrada armazenada em library também.

challenge icon

Desafio

Fácil

Estenda o loop do menu com o ramo "4":

  1. print o prompt Title: e leia-o
  2. Use find para localizar o livro com esse título exato
  3. Se não houver correspondência, imprima Not found.
  4. Caso contrário, defina book[:read] = true e imprima Marked as read!

Mantenha todos os ramos anteriores funcionando.

Para entradas que adicionam The Hobbit, marcam como lido e depois saem, o bloco de marcação imprime:

Choose an option: Title: Marked as read!

Folha de consulta

Use find para localizar o primeiro elemento correspondente em um array (retorna nil se não for encontrado):

book = library.find { |b| b[:title] == query }

Como os hashes compartilham identidade dentro de arrays, mutar o objeto encontrado atualiza a entrada original:

if book.nil?
  puts "Not found."
else
  book[:read] = true
  puts "Marked as read!"
end

Experimente você mesmo

library = []

loop do
  puts "--- Library Manager ---"
  puts "1. Add Book"
  puts "2. Search By Title"
  puts "3. Filter By Genre"
  puts "4. Mark As Read"
  puts "5. Exit"
  print "Choose an option: "
  choice = gets.chomp
  if choice == "5"
    puts "Goodbye!"
    break
  elsif choice == "1"
    print "Title: "
    title = gets.chomp
    print "Author: "
    author = gets.chomp
    print "Genre: "
    genre = gets.chomp
    library.push({ title: title, author: author, genre: genre, read: false })
    puts "Book added!"
  elsif choice == "2"
    print "Search title: "
    query = gets.chomp
    matches = library.select { |b| b[:title].downcase.include?(query.downcase) }
    if matches.empty?
      puts "No matches."
    else
      matches.each { |b| puts "#{b[:title]} by #{b[:author]}" }
    end
  elsif choice == "3"
    print "Genre: "
    genre = gets.chomp
    matches = library.select { |b| b[:genre] == genre }
    matches.each { |b| puts "#{b[:title]} by #{b[:author]}" }
    puts "Total: #{matches.length}"
  end
  # TODO: lidar com choice == "4", buscar pelo título exato,
  # definir book[:read] = true, exibir "Marked as read!" ou "Not found."
end
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e Fluxo