タイトルで検索
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 30/56。
2. Search By Title オプションを追加します。ユーザーが検索語を入力すると、プログラムはその語を含むすべての本を、大文字と小文字を区別せずに表示します。
ここで、前の章のselectが活きてきます。1つのブロックだけで、手動のループは不要です:
matches = library.select do |book|
book[:title].downcase.include?(query.downcase)
endチャレンジ
簡単メニューのループを拡張します。選択肢が "2" の場合:
printでプロンプトSearch title:を表示し、クエリを読み取りますselectを使用して、タイトルに(大文字と小文字を区別せずに)クエリが含まれている本を探します- 一致するものがない場合は、
No matches.と出力します - 一致するものがある場合は、各一致項目について
<title> by <author>という形式で1行ずつ出力します
前のレッスンで作成した 1 (Add Book) と 5 (Exit) の動作はそのまま維持してください。
入力が 1, The Hobbit, Tolkien, Fantasy, 2, hobbit, そして 5 の場合、一致する出力ブロックは以下のようになります:
Choose an option: Search title: The Hobbit by Tolkienチートシート
大文字と小文字を区別しないタイトル検索には、selectとdowncase.include?を使用します:
matches = library.select do |book|
book[:title].downcase.include?(query.downcase)
end結果またはフォールバックメッセージを表示します:
if matches.empty?
puts "No matches."
else
matches.each { |book| puts "#{book[:title]} by #{book[:author]}" }
end自分で試してみよう
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!"
end
# TODO: choice == "2" の処理、クエリの入力、一致する本の選択、
# "No matches." または一致した本を1行ずつ表示: "<title> by <author>"
end
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。