النطاقات والتعداد (Ranges & Enumerables)
النطاقات (Ranges) هي طريقة أنيقة لتمثيل تسلسل من القيم، والتعداد (Enumerables) هي مجموعة قوية من الدوال للتعامل مع المجموعات. معاً، تُشكّل أدوات أساسية لمعالجة البيانات في روبي.
ما هو النطاق؟
النطاق يُمثّل تسلسلاً متتابعاً من القيم، من قيمة بداية إلى قيمة نهاية.
أنواع النطاقات
النطاق الشامل (Inclusive): نقطتان ..
يشمل القيمة الأولى والأخيرة:
النطاق الحصري (Exclusive): ثلاث نقاط ...
يشمل القيمة الأولى بدون الأخيرة:
جدول مقارنة النطاقات
| النوع | الرمز | المثال | النتيجة |
|---|---|---|---|
| شامل | .. | 1..5 | 1, 2, 3, 4, 5 |
| حصري | ... | 1...5 | 1, 2, 3, 4 |
استخدامات النطاقات
التكرار باستخدام each
الناتج:
التحقق من الانتماء (include?)
نطاقات الحروف
النطاقات في case/when
قطع النصوص والمصفوفات
معلومات عن النطاق
التعداد (Enumerables)
التعداد (Enumerable) هو وحدة (module) تُضاف للمصفوفات والقواميس والنطاقات، وتوفر دوال قوية لمعالجة المجموعات.
الدوال الأساسية للتعداد
each - التكرار الأساسي
الناتج:
each_with_index - التكرار مع الفهرس
الناتج:
map (أو collect) - التحويل
تُطبّق عملية على كل عنصر وتُرجع مصفوفة جديدة:
select (أو find_all) - التصفية
تُرجع العناصر التي تُحقق شرطاً معيناً:
reject - عكس select
تُرجع العناصر التي لا تُحقق الشرط:
find (أو detect) - البحث عن أول عنصر
تُرجع أول عنصر يُحقق الشرط:
find_all vs find
reduce (أو inject) - التجميع
تُجمّع كل العناصر في قيمة واحدة:
any? و all? و none?
count - العدّ بشرط
take و drop
partition - التقسيم
تُقسّم المجموعة إلى مصفوفتين بناءً على شرط:
group_by - التجميع
جدول ملخص: دوال التعداد الأساسية
| الدالة | الوصف | نوع الناتج |
|---|---|---|
each | التكرار على كل عنصر | المصفوفة الأصلية |
map | تحويل كل عنصر | مصفوفة جديدة |
select | تصفية العناصر المطابقة | مصفوفة جديدة |
reject | تصفية العناصر غير المطابقة | مصفوفة جديدة |
find | البحث عن أول عنصر مطابق | عنصر واحد أو nil |
reduce | تجميع في قيمة واحدة | قيمة واحدة |
any? | هل يوجد عنصر مطابق؟ | true/false |
all? | هل كل العناصر مطابقة؟ | true/false |
none? | هل لا يوجد عنصر مطابق؟ | true/false |
count | عدد العناصر (المطابقة) | رقم |
سلسلة الدوال (Method Chaining)
يمكن ربط عدة دوال معاً للحصول على نتائج معقدة:
أمثلة عملية
مثال 1: تصفية وتحويل بيانات الطلاب
مثال 2: معالجة قائمة أسعار
مثال 3: تحليل النص
الناتج:
مثال 4: التحقق من بيانات
الفرق بين each و map
نصائح مهمة
- استخدم map للتحويل - عندما تريد تغيير كل عنصر
- استخدم select للتصفية - عندما تريد اختيار عناصر معينة
- استخدم find للبحث - عندما تريد أول عنصر مطابق فقط
- استخدم reduce للتجميع - عندما تريد قيمة واحدة من مجموعة
- سلسل الدوال - للحصول على شيفرة أنظف وأوضح
..شامل،...حصري - تذكر الفرق بين نوعي النطاق
تمرين: تصفية وتحويل البيانات
حان وقت التطبيق! في محرر الشيفرة على اليسار:
المطلوب:
- أنشئ مصفوفة
numbersتحتوي على الأرقام من 1 إلى 20 باستخدام النطاق - استخدم
selectلاختيار الأرقام الزوجية فقط - استخدم
mapلضرب كل رقم في 3 - استخدم
reduceلحساب مجموع النتائج - اطبع النتائج بهذا الترتيب:
- المصفوفة الأصلية (الأرقام من 1-20)
- الأرقام الزوجية
- الأرقام مضروبة في 3
- المجموع النهائي
تلميحات:
- لإنشاء المصفوفة من نطاق:
numbers = (1..20).to_a - للتصفية:
evens = numbers.select { |n| n.even? } - للتحويل:
tripled = evens.map { |n| n * 3 } - للمجموع:
sum = tripled.reduce(:+)أوtripled.sum - استخدم
pلطباعة المصفوفات
الناتج المتوقع:
تذكّر: النطاقات والتعداد أدوات قوية تجعل شيفرتك أكثر إيجازاً وقراءة!