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.
Sfida
FacileEstendi il ciclo del menu con il ramo "4":
- Usa
printper visualizzare il promptTitle:e leggilo - Usa
findper individuare il libro con quel titolo esatto - Se non ci sono corrispondenze, stampa
Not found. - Altrimenti, imposta
book[:read] = truee stampaMarked 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
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Panoramica dei metodi delle stringheInterpolazione di stringheIterare sulle stringheDividere e unireRiepilogo - Tessitore di stringhe4Blocchi, Proc e Lambda
Che cos’è un Block?do..end vs parentesi graffeLa keyword yieldParametri del BlockProc e LambdaRiepilogo - Iteratore personalizzato7Hash in Ruby - Parte 2
Hash.new con valori predefinitiIterare sugli hashHash annidatiUnire e trasformareRipasso - Contatore di frequenza10Progetto - Registri degli studenti
Panoramica del progettoAggiungere uno studente2Intervalli
Che cos'è un intervallo?Metodi degli intervalliIntervalli in Case / WhenRiepilogo - Esercitarsi con gli intervalli5La potenza di Enumerable
Select e RejectConcatenare MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRiepilogo - Pipeline di dati3Array bidimensionali
Basi degli array 2DAccesso agli elementi 2DIterare sugli array 2DPattern comuni con array 2DRiepilogo - Operazioni sulle matrici6Progetto - Gestore della biblioteca
Panoramica del progettoAggiungere un libroEsercitati da solo: Compilatore Ruby online