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

الـ Hashes المتداخلة

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

يمكن أن تكون قيمة الـ hash نفسها عبارة عن hash. هذا الشكل المتداخل هو الطريقة التي تمثل بها لغة Ruby عادةً السجلات المهيكلة، وهي عبارة عن hash واحد مفتاحه هو المعرف id (أو الاسم)، حيث تحمل كل قيمة حقولها الخاصة:

students = {
  "Alice" => { age: 20, grade: "A" },
  "Bob"   => { age: 22, grade: "B" }
}

للوصول إلى قيمة متداخلة، قم بتسلسل عمليات البحث:

puts students["Alice"][:age]    # 20
puts students["Bob"][:grade]    # B

إضافة حقل جديد إلى أحد الهاشات (hashes) الداخلية يعمل بنفس الطريقة:

students["Alice"][:major] = "Math"
puts students["Alice"]
# {age: 20, grade: "A", major: "Math"}

للقراءة بأمان من hash متداخل قد يفتقد لمفتاح في أي مستوى، تقوم dig بتتبع السلسلة وتعيد nil إذا كان أي عنصر في الطريق مفقوداً:

students.dig("Alice", :grade)   # "A"
students.dig("Cara",  :grade)   # nil
challenge icon

التحدي

متوسط

يتم توفير hash متداخل باسم inventory: كل مفتاح في المستوى العلوي يمثل قسماً (department)، وكل مفتاح داخلي يمثل صنفاً (item)، وكل قيمة داخلية تمثل الكمية المخزنة (عدد صحيح).

اقرأ سطراً واحداً من المدخلات: قائمة مفصولة بفاصلة من مسارات البحث بتنسيق department/item.

لكل مسار، وبالترتيب، استخدم dig للوصول إليه. اطبع إما:

  • <department>/<item>: <qty> عندما يكون المسار موجوداً
  • <department>/<item>: missing عندما تعيد dig القيمة nil

بعد طباعة كل سطر، اطبع أيضاً سطر ملخص واحداً:

Total inventory: <sum>

الإجمالي هو مجموع كل الكميات عبر جميع الأقسام في الـ hash الأصلي. استخدم التكرار المتداخل (لكل قسم، ثم لكل صنف).

للمدخلات fruits/apples,meat/beef,fruits/dragonfruit,dairy/milk، يكون المخرج هو:

fruits/apples: 12
meat/beef: 7
fruits/dragonfruit: missing
dairy/milk: 9
Total inventory: 39

ورقة مرجعية

تخزن الـ hashes المتداخلة قيم hashes أخرى بداخل hash آخر:

students = {
  "Alice" => { age: 20, grade: "A" },
  "Bob"   => { age: 22, grade: "B" }
}

استخدم عمليات البحث المتسلسلة للوصول إلى القيم المتداخلة:

students["Alice"][:age]    # 20

قم بالتعيين لإضافة أو تحديث حقل متداخل:

students["Alice"][:major] = "Math"

استخدم dig للتنقل بأمان عبر المفاتيح المتداخلة — تُرجع nil إذا كان أي مفتاح مفقوداً:

students.dig("Alice", :grade)   # "A"
students.dig("Cara",  :grade)   # nil

جرّب بنفسك

inventory = {
  fruits: { apples: 12, bananas: 4 },
  meat:   { beef: 7, chicken: 5 },
  dairy:  { milk: 9, cheese: 2 }
}
lookups = gets.chomp.split(",")

# مهام: لكل عملية بحث، ابحث واطبع الكمية أو 'missing'.
#       ثم اطبع 'Total inventory: <sum>' لجميع العناصر.
quiz iconاختبر نفسك

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

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