Menu
Coddy logo textTech

Oznacz jako przeczytaną

Część sekcji Logika i przepływ programu ścieżki Ruby w Coddy. Lekcja 32 z 56.

Dodaj ostatnią opcję, 4. Mark As Read. Użytkownik wpisuje dokładny tytuł, a program zmienia wartość klucza :read tej książki z false na true.

Aby znaleźć książkę, użyj find: zwraca pierwszy element pasujący do bloku albo nil, gdy nic nie pasuje:

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

Jeśli book ma wartość nil, zgłoś, że nie znaleziono żadnej książki. W przeciwnym razie zmodyfikuj ją w miejscu. Hashe Ruby zachowują swoją tożsamość wewnątrz tablicy, więc aktualizacja book[:read] aktualizuje również wpis przechowywany w library.

challenge icon

Wyzwanie

Łatwy

Rozszerz pętlę menu o gałąź "4":

  1. Użyj print, aby wyświetlić podpowiedź Title: , i odczytaj tytuł
  2. Użyj find, aby znaleźć książkę o dokładnie takim tytule
  3. Jeśli nie ma dopasowania, wyświetl Not found.
  4. W przeciwnym razie ustaw book[:read] = true i wyświetl Marked as read!

Zadbaj o to, by wszystkie wcześniejsze gałęzie nadal działały.

Dla danych wejściowych, które dodają The Hobbit, oznaczają ją jako przeczytaną, a następnie kończą program, blok oznaczania wyświetla:

Choose an option: Title: Marked as read!

Spróbuj swoich sił

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: obsłuż choice == "4", znajdź po dokładnym tytule,
  # ustaw book[:read] = true, wyświetl "Marked as read!" lub "Not found."
end
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ programu

Poćwicz samodzielnie: Kompilator Ruby online