Đá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.
Thử thách
DễMở rộng vòng lặp menu bằng nhánh "4":
printlời nhắcTitle:rồi đọc tiêu đề- Dùng
findđể tìm sách có tiêu đề khớp chính xác - Nếu không tìm thấy kết quả khớp, in ra
Not found. - Nếu tìm thấy, đặt
book[:read] = truerồi in raMarked 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
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ý
1Tìm hiểu sâu về chuỗi
Tổng quan về phương thức chuỗiNội suy chuỗiDuyệt qua chuỗiTách và nối chuỗiÔn tập: Đan chuỗi4Khối lệnh, Proc và lambda
Khối lệnh là gì?do..end và dấu ngoặc nhọnTừ khóa yieldTham số của khối lệnhProc và lambdaÔn tập: bộ lặp tùy chỉnh7Hash, phần 2
Hash.new với giá trị mặc địnhLặp qua HashHash lồng nhauGộp và chuyển đổiÔn tập: Bộ đếm tần suất10Dự án: Hồ sơ học sinh
Tổng quan dự ánThêm học sinh2Phạm vi
Phạm vi là gì?Các phương thức của phạm viPhạm vi trong case / whenÔn tập: luyện tập với phạm vi5Sức mạnh của Enumerable
select và rejectNối chuỗi mapreduce / injectcount, all?, any?, none?group_by và partitionsort_by, min_by, max_byÔn tập: quy trình dữ liệu3Mảng 2 chiều
Kiến thức cơ bản về mảng 2 chiềuTruy cập phần tử trong mảng 2 chiềuDuyệt qua mảng 2 chiềuCác mẫu phổ biến với mảng 2 chiềuÔn tập: thao tác với ma trận6Dự án: Trình quản lý thư viện
Tổng quan dự ánThêm sáchTự luyện tập: Trình biên dịch Ruby online