Menu
Coddy logo textTech

읽음 상태로 표시

Coddy Ruby 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 32번째.

마지막 옵션인 4. Mark As Read를 추가하세요. 사용자가 정확한 제목을 입력하면 프로그램이 해당 도서의 :read 키를 false에서 true로 변경합니다.

책을 찾으려면 find를 사용하세요. 이 메서드는 블록과 일치하는 첫 번째 요소를 반환하며, 일치하는 항목이 없으면 nil을 반환합니다:

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

만약 booknil이면, 책을 찾을 수 없다고 보고합니다. 그렇지 않으면, 그 자리에서 수정합니다. Ruby 해시는 배열 내에서 자신의 정체성을 공유하므로, book[:read]를 업데이트하면 library에 저장된 항목도 함께 업데이트됩니다.

challenge icon

챌린지

쉬움

"4" 분기를 사용하여 메뉴 루프를 확장하세요:

  1. Title: 프롬프트를 print하고 입력값을 읽습니다.
  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실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 및 흐름의 모든 레슨