القواميس (Hashes)
القواميس (تُسمى أيضاً Hash أو Dictionary) هي بنية بيانات تُخزّن أزواجاً من المفاتيح والقيم. بدلاً من الوصول إلى العناصر بالفهرس الرقمي كما في المصفوفات، تستخدم القواميس مفاتيح للوصول إلى القيم.
ما هو القاموس؟
القاموس يشبه قاموس اللغة: لكل كلمة (المفتاح) يوجد تعريف (القيمة).
إنشاء القواميس
الطريقة الأساسية: الأقواس المعقوفة
باستخدام Hash.new
المفاتيح الرمزية (Symbol Keys)
في روبي، الطريقة الأكثر شيوعاً هي استخدام الرموز (Symbols) كمفاتيح لأنها أسرع وأكفأ في الذاكرة.
الصيغة القديمة: السهم الكبير
الصيغة الحديثة (المفضلة): النقطتين بعد المفتاح
مقارنة الصيغتين
| الصيغة | المثال | الاستخدام |
|---|---|---|
| السهم الكبير | :key => value | صالحة لأي نوع من المفاتيح |
| النقطتين | key: value | للرموز فقط، أكثر شيوعاً |
الوصول إلى القيم
باستخدام الأقواس المربعة
باستخدام fetch (مع قيمة افتراضية)
باستخدام dig للقواميس المتداخلة
إضافة وتعديل القيم
إضافة قيم جديدة
تعديل قيم موجودة
باستخدام store
دمج قواميس باستخدام merge
حذف القيم
delete - حذف مفتاح معين
delete_if - حذف بشرط
clear - حذف الكل
معلومات عن القاموس
الحصول على المفاتيح والقيم
التكرار على القواميس
each - المفتاح والقيمة معاً
الناتج:
each_key - المفاتيح فقط
الناتج:
each_value - القيم فقط
جدول ملخص: دوال القواميس الأساسية
| الدالة | الوصف | المثال |
|---|---|---|
[] | الوصول للقيمة | hash[:key] |
[]= | تعيين قيمة | hash[:key] = value |
fetch | الوصول مع قيمة افتراضية | hash.fetch(:key, default) |
keys | جميع المفاتيح | hash.keys |
values | جميع القيم | hash.values |
key? | هل المفتاح موجود؟ | hash.key?(:key) |
value? | هل القيمة موجودة؟ | hash.value?(val) |
delete | حذف مفتاح | hash.delete(:key) |
merge | دمج قاموسين | hash1.merge(hash2) |
length | عدد الأزواج | hash.length |
empty? | هل فارغ؟ | hash.empty? |
each | التكرار | hash.each { |k,v| ... } |
أمثلة عملية
مثال 1: بيانات شخص
الناتج:
مثال 2: عدّاد الكلمات
الناتج:
مثال 3: قائمة الطلاب ودرجاتهم
الناتج:
مثال 4: إعدادات التطبيق
الناتج:
القواميس المتداخلة
يمكن أن تحتوي قيمة القاموس على قاموس آخر:
نصائح مهمة
- استخدم الرموز كمفاتيح - أسرع وأكفأ من النصوص
- استخدم الصيغة الحديثة -
name: "أحمد"بدلاً من:name => "أحمد" - استخدم fetch للقيم الافتراضية - بدلاً من التحقق اليدوي من nil
- استخدم dig للقواميس المتداخلة - يتجنب أخطاء nil
- استخدم Hash.new(0) للعدّادات - يوفر التحقق من الوجود
الفرق بين المصفوفات والقواميس
| الخاصية | المصفوفة | القاموس |
|---|---|---|
| الوصول | بالفهرس الرقمي [0, 1, 2] | بالمفتاح [:name, :age] |
| الترتيب | مرتبة دائماً | مرتبة (Ruby 1.9+) |
| الاستخدام | قوائم متجانسة | بيانات مُسمّاة |
| المثال | [1, 2, 3] | {a: 1, b: 2} |
تمرين: إنشاء واستعلام قاموس شخص
حان وقت التطبيق! في محرر الشيفرة على اليسار:
المطلوب:
- أنشئ قاموساً
personيحتوي على:nameبقيمة "فاطمة"ageبقيمة 30cityبقيمة "دبي"skillsبقيمة مصفوفة ["Ruby", "Python"]
- اطبع الاسم
- اطبع المدينة
- أضف مفتاحاً جديداً
jobبقيمة "مبرمجة" - اطبع عدد المفاتيح في القاموس
- اطبع جميع المفاتيح باستخدام p
- تحقق هل المفتاح
:emailموجود واطبع النتيجة
تلميحات:
- استخدم الصيغة الحديثة:
key: value - للمصفوفة داخل القاموس:
skills: ["Ruby", "Python"] - لإضافة مفتاح جديد:
person[:job] = "مبرمجة" - لعدد المفاتيح:
person.lengthأوperson.keys.length
الناتج المتوقع:
تذكّر: القواميس مثالية لتخزين البيانات المُسمّاة، والرموز هي أفضل خيار للمفاتيح!