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.
Wyzwanie
ŁatwyRozszerz pętlę menu o gałąź "4":
- Użyj
print, aby wyświetlić podpowiedźTitle:, i odczytaj tytuł - Użyj
find, aby znaleźć książkę o dokładnie takim tytule - Jeśli nie ma dopasowania, wyświetl
Not found. - W przeciwnym razie ustaw
book[:read] = truei wyświetlMarked 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
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
1Łańcuchy znaków w szczegółach
Przegląd metod łańcuchów znakówInterpolacja łańcuchów znakówIterowanie po łańcuchach znakówDzielenie i łączeniePowtórka – Tkacz łańcuchów znaków4Bloki, procki i lambdy
Czym jest blok?do..end a nawiasy klamroweSłowo kluczowe yieldParametry blokuProcki i lambdyPodsumowanie — własny iterator7Hashe, część 2
Hash.new z wartościami domyślnymiIterowanie po haszachZagnieżdżone haszeŁączenie i przekształcaniePowtórka — licznik częstotliwości10Projekt – ewidencja uczniów
Przegląd projektuDodawanie ucznia5Potęga Enumerable
Select i RejectŁączenie wywołań mapReduce / Injectcount, all?, any?, none?group_by i partitionsort_by, min_by, max_byPodsumowanie — potok danych8Zaawansowane podejmowanie decyzji
case z klasami i wyrażeniami regularnymiwhen z wieloma wartościamiOperator trójargumentowyInline if / unlessPowtórka – klasyfikator ocen3Tablice 2D
Podstawy tablic 2DDostęp do elementów tablic 2DIterowanie po tablicach 2DTypowe wzorce 2DPowtórzenie – operacje na macierzach6Projekt – Menedżer biblioteki
Przegląd projektuDodaj książkęPoćwicz samodzielnie: Kompilator Ruby online