Menu
CoddyTech

Tandai Sudah Dibaca

Termasuk bagian Logika dan Alur dalam perjalanan Ruby di Coddy. Pelajaran 32 dari 56.

Tambahkan opsi terakhir, 4. Mark As Read. Pengguna mengetik judul yang persis, lalu program mengubah kunci :read buku itu dari false menjadi true.

Untuk menemukan buku, gunakan find: fungsi ini mengembalikan elemen pertama yang cocok dengan blok, atau nil jika tidak ada yang cocok:

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

Jika book adalah nil, laporkan bahwa buku tidak ditemukan. Jika tidak, ubah nilainya langsung. Hash Ruby berbagi identitas di dalam array, jadi memperbarui book[:read] juga memperbarui entri yang tersimpan di library.

challenge icon

Tantangan

Mudah

Perluas perulangan menu dengan cabang "4":

  1. print prompt Title: lalu baca judulnya
  2. Gunakan find untuk menemukan buku dengan judul yang sama persis
  3. Jika tidak ada yang cocok, cetak Not found.
  4. Jika tidak, atur book[:read] = true lalu cetak Marked as read!

Pastikan semua cabang sebelumnya tetap berfungsi.

Untuk input yang menambahkan The Hobbit, menandainya sudah dibaca, lalu keluar, blok penandaan mencetak:

Choose an option: Title: Marked as read!

Coba sendiri

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: tangani choice == "4", cari berdasarkan judul yang persis sama,
  # atur book[:read] = true, tampilkan "Marked as read!" atau "Not found."
end
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler Ruby online