Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Erweitern Sie die Menüschleife um den Zweig "4":

  1. print Sie die Eingabeaufforderung Title: und lesen Sie diese ein
  2. Verwenden Sie find, um das Buch mit genau diesem Titel zu finden
  3. Falls keine Übereinstimmung gefunden wird, geben Sie Not found. aus
  4. Andernfalls setzen Sie book[:read] = true und geben Sie Marked 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!"
end

Probier 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
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Programmfluss