Als gelesen markieren
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy — Lektion 32 von 56.
Fügen Sie die letzte Option hinzu, 4. Mark As Read. Der Benutzer gibt einen exakten Titel ein und das Programm ändert den :read-Schlüssel dieses Buches von false auf true.
Um das Buch zu finden, verwende find: es gibt das erste Element zurück, das auf den Block passt, oder nil, wenn nichts übereinstimmt:
book = library.find { |b| b[:title] == query }Wenn book nil ist, melde, dass kein Buch gefunden wurde. Andernfalls ändere es direkt (in place), da Ruby-Hashes ihre Identität innerhalb des Arrays teilen, sodass das Aktualisieren von book[:read] auch den in library gespeicherten Eintrag aktualisiert.
Aufgabe
EinfachErweitern Sie die Menüschleife um den Zweig "4":
printSie die EingabeaufforderungTitle:und lesen Sie diese ein- Verwenden Sie
find, um das Buch mit genau diesem Titel zu finden - Falls keine Übereinstimmung gefunden wird, geben Sie
Not found.aus - Andernfalls setzen Sie
book[:read] = trueund geben SieMarked as read!aus
Stellen Sie sicher, dass alle vorherigen Zweige weiterhin funktionieren.
Für Eingaben, die The Hobbit hinzufügen, es als gelesen markieren und dann beenden, gibt der Markierungsblock Folgendes aus:
Choose an option: Title: Marked as read!Spickzettel
Verwenden Sie find, um das erste übereinstimmende Element in einem Array zu finden (gibt nil zurück, wenn nichts gefunden wurde):
book = library.find { |b| b[:title] == query }Da Hashes innerhalb von Arrays dieselbe Identität teilen, aktualisiert das Verändern des gefundenen Objekts den ursprünglichen Eintrag:
if book.nil?
puts "Not found."
else
book[:read] = true
puts "Marked as read!"
endProbier es selbst
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: choice == "4" verarbeiten, nach exaktem Titel suchen,
# book[:read] = true setzen, "Marked as read!" oder "Not found." ausgeben
end
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Programmfluss
1Strings im Detail
String-Methoden im ÜberblickString-InterpolationIterieren über StringsSplit und JoinRückblick – String Weaver4Blöcke, Procs & Lambdas
Was ist ein Block?do..end vs. geschweifte KlammernDas yield-SchlüsselwortBlock-ParameterProcs und LambdasZusammenfassung – Eigener Iterator7Hashes Teil 2
Hash.new mit StandardwertenIterieren über HashesVerschachtelte HashesZusammenführen und TransformierenRückblick – Häufigkeitszähler10Projekt - Studentenverwaltung
ProjektübersichtStudent hinzufügen5Enumerable-Kraftpaket
Select und RejectMap-VerkettungReduce / Injectcount, all?, any?, none?group_by und partitionsort_by, min_by, max_byZusammenfassung – Data Pipeline8Fortgeschrittene Entscheidungslogik
Case mit Klassen & RegexMulti-Value whenTernärer OperatorInline if / unlessRückblick – Noten-Klassifizierer32D-Arrays
2D-Array GrundlagenZugriff auf 2D-ElementeIterieren über 2D-ArraysGängige 2D-MusterZusammenfassung – Matrix-Operationen6Projekt - Bibliotheksverwaltung
ProjektübersichtBuch hinzufügen