읽음 상태로 표시
Coddy Ruby 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 32번째.
마지막 옵션인 4. Mark As Read를 추가하세요. 사용자가 정확한 제목을 입력하면 프로그램이 해당 도서의 :read 키를 false에서 true로 변경합니다.
책을 찾으려면 find를 사용하세요. 이 메서드는 블록과 일치하는 첫 번째 요소를 반환하며, 일치하는 항목이 없으면 nil을 반환합니다:
book = library.find { |b| b[:title] == query }만약 book이 nil이면, 책을 찾을 수 없다고 보고합니다. 그렇지 않으면, 그 자리에서 수정합니다. Ruby 해시는 배열 내에서 자신의 정체성을 공유하므로, book[:read]를 업데이트하면 library에 저장된 항목도 함께 업데이트됩니다.
챌린지
쉬움"4" 분기를 사용하여 메뉴 루프를 확장하세요:
Title:프롬프트를print하고 입력값을 읽습니다.find를 사용하여 해당 제목과 정확히 일치하는 도서를 찾습니다.- 일치하는 항목이 없으면
Not found.를 출력합니다. - 일치하는 항목이 있으면
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
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.