Menu
Coddy logo textTech

タイトルで検索

CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 30/56。

2. Search By Title オプションを追加します。ユーザーが検索語を入力すると、プログラムはその語を含むすべての本を、大文字と小文字を区別せずに表示します。

ここで、前の章のselectが活きてきます。1つのブロックだけで、手動のループは不要です:

matches = library.select do |book|
  book[:title].downcase.include?(query.downcase)
end
challenge icon

チャレンジ

簡単

メニューのループを拡張します。選択肢が "2" の場合:

  1. print でプロンプト Search title: を表示し、クエリを読み取ります
  2. select を使用して、タイトルに(大文字と小文字を区別せずに)クエリが含まれている本を探します
  3. 一致するものがない場合は、No matches. と出力します
  4. 一致するものがある場合は、各一致項目について <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

チートシート

大文字と小文字を区別しないタイトル検索には、selectdowncase.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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン