Menu
Coddy logo textTech

Отметить как прочитанное

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

Добавьте последний вариант, 4. Mark As Read. Пользователь вводит точное название, и программа меняет у этой книги ключ :read с false на true.

Чтобы найти книгу, используйте find: он возвращает первый элемент, соответствующий блоку, или nil, если совпадений нет:

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

Если book равен nil, сообщите, что книга не найдена. В противном случае измените её на месте; хеши Ruby сохраняют свою идентичность внутри массива, поэтому обновление book[:read] также обновляет запись, хранящуюся в library.

challenge icon

Задание

Легко

Расширьте цикл меню веткой "4":

  1. Выведите через print приглашение Title: и прочитайте ввод
  2. Используйте find, чтобы найти книгу с таким точным названием
  3. Если совпадений нет, выведите Not found.
  4. В противном случае установите book[:read] = true и выведите Marked as read!

Сохраните работоспособность всех предыдущих веток.

Для входных данных, которые добавляют The Hobbit, помечают его как прочитанное, а затем завершают работу, блок пометки выводит:

Choose an option: Title: Marked as read!

Шпаргалка

Используйте find, чтобы найти первый подходящий элемент в массиве (возвращает nil, если элемент не найден):

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

Поскольку хеши внутри массивов разделяют идентичность, изменение найденного объекта обновляет исходную запись:

if book.nil?
  puts "Not found."
else
  book[:read] = true
  puts "Marked as read!"
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!"
  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: обработать choice == "4", найти по точному названию,
  # установить book[:read] = true, вывести "Marked as read!" или "Not found."
end
quiz iconПроверьте себя

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

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