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.
Desafío
FácilExtiende el bucle del menú con la rama "4":
- Usa
printpara mostrar el mensajeTitle:y léelo - Usa
findpara localizar el libro con ese título exacto - Si no hay coincidencia, imprime
Not found. - De lo contrario, establece
book[:read] = truee imprimeMarked 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!"
endPrué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
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
1Strings en profundidad
Visión general de los métodos de StringInterpolación de StringsIterar sobre StringsSplit y JoinRepaso - String Weaver4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end vs llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasResumen - Iterador personalizado7Hashes Parte 2
Hash.new con valores por defectoIteración de HashesHashes anidadosFusión y transformaciónResumen - Contador de frecuencia10Proyecto - Registros de Estudiantes
Descripción general del proyectoAgregar estudiante5Potencia de Enumerable
Select y RejectEncadenando MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byResumen - Data Pipeline3Arreglos 2D
Conceptos básicos de arreglos 2DAcceso a elementos 2DIteración sobre arreglos 2DPatrones comunes en 2DResumen - Operaciones con matrices6Proyecto - Gestor de biblioteca
Descripción general del proyectoAñadir libro