Marquer comme lu
Fait partie de la section Logique et Flux du Journey Ruby de Coddy — leçon 32 sur 56.
Ajoutez la dernière option, 4. Mark As Read. L'utilisateur saisit un titre exact et le programme fait basculer la clé :read de ce livre de false à true.
Pour trouver le livre, utilisez find : il renvoie le premier élément correspondant au bloc, ou nil lorsque rien ne correspond :
book = library.find { |b| b[:title] == query }Si book est nil, indiquez qu'aucun livre n'a été trouvé. Sinon, modifiez-le sur place ; les hashs Ruby partagent leur identité à l'intérieur du tableau, donc la mise à jour de book[:read] met également à jour l'entrée stockée dans library.
Défi
FacileÉtendez la boucle du menu avec la branche "4" :
printl'inviteTitle:et lisez la saisie- Utilisez
findpour localiser le livre avec ce titre exact - Si aucune correspondance n'est trouvée, affichez
Not found. - Sinon, définissez
book[:read] = trueet affichezMarked as read!
Maintenez le fonctionnement de toutes les branches précédentes.
Pour les entrées qui ajoutent The Hobbit, le marquent comme lu, puis quittent, le bloc de marquage affiche :
Choose an option: Title: Marked as read!Aide-mémoire
Utilisez find pour localiser le premier élément correspondant dans un tableau (renvoie nil s'il n'est pas trouvé) :
book = library.find { |b| b[:title] == query }Comme les hashs partagent leur identité à l'intérieur des tableaux, la mutation de l'objet trouvé met à jour l'entrée d'origine :
if book.nil?
puts "Not found."
else
book[:read] = true
puts "Marked as read!"
endEssayez vous-même
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
# À FAIRE : gérer choice == "4", trouver par titre exact,
# définir book[:read] = true, afficher "Marked as read!" ou "Not found."
end
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique et Flux
1Les chaînes de caractères en profondeur
Aperçu des méthodes de chaînesInterpolation de chaînesParcourir les chaînesSplit et JoinRécapitulatif - String Weaver4Blocs, Procs & Lambdas
Qu'est-ce qu'un bloc ?do..end vs AccoladesLe mot-clé yieldParamètres de blocProcs et LambdasRécapitulatif - Itérateur personnalisé7Hashes - Partie 2
Hash.new avec des valeurs par défautItérer sur les HashesHashes imbriquésFusion et transformationRécapitulatif - Compteur de fréquence10Projet - Dossiers étudiants
Présentation du projetAjouter un étudiant2Intervalles
Qu'est-ce qu'un intervalle ?Méthodes d'intervalleLes intervalles dans Case / WhenRécapitulatif - Pratique des intervalles5La puissance d'Enumerable
Select et RejectChaîner MapReduce / Injectcount, all?, any?, none?group_by et partitionsort_by, min_by, max_byRécapitulatif - Data Pipeline3Tableaux 2D
Bases des tableaux 2DAccéder aux éléments 2DParcourir des tableaux 2DModèles 2D courantsRécapitulatif - Opérations sur les matrices6Projet - Gestionnaire de bibliothèque
Présentation du projetAjouter un livre