Menu
CoddyTech

Đánh dấu đã đọc

Thuộc phần Logic và luồng xử lý trong hành trình Ruby của Coddy. Bài học 32 trên 56.

Thêm tùy chọn cuối cùng, 4. Mark As Read. Người dùng nhập chính xác tên sách và chương trình chuyển khóa :read của cuốn sách đó từ false thành true.

Để tìm sách, hãy dùng find: phương thức này trả về phần tử đầu tiên khớp với khối lệnh, hoặc nil nếu không có phần tử nào khớp:

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

Nếu book là nil, hãy báo rằng không tìm thấy sách. Nếu không, hãy thay đổi trực tiếp đối tượng đó. Các hash trong Ruby giữ nguyên danh tính bên trong mảng, vì vậy khi cập nhật book[:read], mục được lưu trong library cũng được cập nhật.

challenge icon

Thử thách

Dễ

Mở rộng vòng lặp menu bằng nhánh "4":

  1. print lời nhắc Title: rồi đọc tiêu đề
  2. Dùng find để tìm sách có tiêu đề khớp chính xác
  3. Nếu không tìm thấy kết quả khớp, in ra Not found.
  4. Nếu tìm thấy, đặt book[:read] = true rồi in ra Marked as read!

Đảm bảo các nhánh trước đó vẫn hoạt động.

Với đầu vào thêm The Hobbit, đánh dấu sách đã đọc rồi thoát, khối lệnh đánh dấu sẽ in ra:

Choose an option: Title: Marked as read!

Tự làm thử

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: xử lý choice == "4", tìm theo tiêu đề chính xác,
  # đặt book[:read] = true, in ra "Marked as read!" hoặc "Not found."
end
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng xử lý

Tự luyện tập: Trình biên dịch Ruby online