Menu
Coddy logo textTech

Marcar como leído

Parte de la sección Lógica y flujo del Journey de Ruby de Coddy — lección 32 de 56.

Añade la opción final, 4. Mark As Read. El usuario escribe un título exacto y el programa cambia la clave :read de ese libro de false a true.

Para encontrar el libro, usa find: devuelve el primer elemento que coincida con el bloque, o nil cuando nada coincide:

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

Si book es nil, informa que no se encontró ningún libro. De lo contrario, modifícalo in situ; los hashes de Ruby comparten su identidad dentro del array, por lo que actualizar book[:read] actualiza la entrada almacenada en library también.

challenge icon

Desafío

Fácil

Extiende el bucle del menú con la rama "4":

  1. Usa print para mostrar el mensaje Title: y léelo
  2. Usa find para localizar el libro con ese título exacto
  3. Si no hay coincidencia, imprime Not found.
  4. De lo contrario, establece book[:read] = true e imprime Marked as read!

Mantén todas las ramas anteriores funcionando.

Para las entradas que añaden The Hobbit, lo marcan como leído y luego salen, el bloque de marcado imprime:

Choose an option: Title: Marked as read!

Hoja de referencia

Usa find para localizar el primer elemento que coincida en un array (devuelve nil si no se encuentra):

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

Dado que los hashes comparten identidad dentro de los arrays, mutar el objeto encontrado actualiza la entrada original:

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

Pruébalo tú mismo

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: manejar choice == "4", buscar por título exacto,
  # establecer book[:read] = true, imprimir "Marked as read!" o "Not found."
end
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y flujo