Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Étendez la boucle du menu avec la branche "4" :

  1. print l'invite Title: et lisez la saisie
  2. Utilisez find pour localiser le livre avec ce titre exact
  3. Si aucune correspondance n'est trouvée, affichez Not found.
  4. Sinon, définissez book[:read] = true et affichez Marked 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!"
end

Essayez 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
quiz iconTestez-vous

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