Menu
Coddy logo textTech

Поиск по названию

Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 30 из 56.

Добавьте опцию 2. Search By Title. Пользователь вводит поисковый запрос, и программа выводит каждую книгу, название которой содержит этот запрос, без учета регистра.

Вот где select из предыдущей главы приносит плоды: один блок, никакого ручного цикла:

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 (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." или по одной строке на каждое совпадение: "<title> by <author>"
end
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком