Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تحديد كمقروء

جزء من قسم المنطق وتدفق العمليات في رحلة Ruby على Coddy — الدرس 32 من 56.

أضف الخيار الأخير، 4. Mark As Read. يقوم المستخدم بكتابة العنوان بدقة ويقوم البرنامج بتغيير مفتاح :read الخاص بهذا الكتاب من false إلى true.

للعثور على الكتاب، استخدم find: فهو يعيد العنصر الأول الذي يطابق الكتلة البرمجية (block)، أو nil عندما لا يتطابق أي شيء:

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

إذا كان book هو nil، فأبلغ بأنه لم يتم العثور على أي كتاب. خلاف ذلك، قم بتعديله في مكانه، حيث تتشارك قواميس Ruby (hashes) هويتها داخل المصفوفة، لذا فإن تحديث book[:read] سيقوم بتحديث المدخل المخزن في library أيضاً.

challenge icon

التحدي

سهل

قم بتوسيع حلقة القائمة باستخدام الفرع "4":

  1. استخدم print لعرض الطلب Title: وقم بقراءته
  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 }

بما أن الـ hashes تشترك في الهوية داخل المصفوفات، فإن تعديل الكائن الذي تم العثور عليه يؤدي إلى تحديث الإدخال الأصلي:

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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق العمليات