Menu
Coddy logo textTech

Contrassegnare come letto

Fa parte della sezione Logica e flusso del percorso Ruby di Coddy. Lezione 32 di 56.

Aggiungi l'opzione finale, 4. Mark As Read. L'utente digita un titolo esatto e il programma imposta la chiave :read di quel libro da false a true.

Per trovare il libro, usa find: restituisce il primo elemento che corrisponde al blocco, oppure nil quando non viene trovato nulla:

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

Se book è nil, segnala che non è stato trovato alcun libro. Altrimenti, modificalo direttamente: gli hash di Ruby condividono la propria identità all'interno dell'array, quindi aggiornando book[:read] aggiorni anche la voce memorizzata in library.

challenge icon

Sfida

Facile

Estendi il ciclo del menu con il ramo "4":

  1. Usa print per visualizzare il prompt Title: e leggilo
  2. Usa find per individuare il libro con quel titolo esatto
  3. Se non ci sono corrispondenze, stampa Not found.
  4. Altrimenti, imposta book[:read] = true e stampa Marked as read!

Assicurati che tutti i rami precedenti continuino a funzionare.

Per gli input che aggiungono The Hobbit, lo contrassegnano come letto e poi escono, il blocco di contrassegno stampa:

Choose an option: Title: Marked as read!

Provalo tu

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: gestisci choice == "4", trova in base al titolo esatto,
  # imposta book[:read] = true, stampa "Marked as read!" oppure "Not found."
end
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Ruby online