الـ 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التحدي
متوسطيتم توفير 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>' لجميع العناصر.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق العمليات
1السلاسل النصية بعمق
نظرة عامة على دوال السلاسل النصيةتضمين النصوص (String Interpolation)التكرار عبر السلاسل النصيةالتقسيم والربط (Split و Join)مراجعة - نساج النصوص4Blocks و Procs و Lambdas
ما هو الـ Block؟do..end مقابل الأقواس { }الكلمة المفتاحية yieldمعاملات الـ BlockProcs و Lambdasمراجعة - Custom Iterator مخصص7Hashes - الجزء الثاني
Hash.new مع القيم الافتراضيةالتكرار عبر الـ Hashesالـ Hashes المتداخلةالدمج والتحويلمراجعة - عداد التكرار10مشروع - سجلات الطلاب
نظرة عامة على المشروعإضافة طالب5قوة الـ Enumerable
Select و Rejectتسلسل MapReduce / Injectcount، all?، any?، none?group_by و partitionsort_by، min_by، max_byمراجعة - Data Pipeline