Enumerators كسولة
التقييم الكسول
Enumerators كسولة درس مجاني في Ruby Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Ruby Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Ruby Academy 4 دروس في المجموع.
التقييم الكسول
تعالج أساليب Enumerable عادةً المجموعة كاملة دفعةً واحدة. أما العدّاد الكسول فيعالج العناصر واحدًا تلو الآخر، عند الحاجة فقط. ويتيح لكم ذلك العمل مع تسلسلات ضخمة أو حتى لا نهائية.
result = (1..Float::INFINITY).lazy.map { |n| n * 2 }.first(5)
p resultمشكلة الأساليب الفورية
إن استدعاء map على نطاق لا نهائي دون استخدام lazy لن ينتهي أبدًا، لأنه يحاول أولًا إنشاء مصفوفة نتائج كاملة.
# Eager version would hang. Lazy completes instantly:
first_three = (1..Float::INFINITY).lazy.select(&:even?).first(3)
p first_threeإنشاء عدّاد كسول
استدعوا .lazy على أي كائن قابل للتعداد للحصول على نسخة كسولة. وتصبح الأساليب المرتبطة كسولة أيضًا.
lazy = (1..10).lazy
puts lazy.classلا يُنفّذ شيء حتى فرض التقييم
تنشئ السلاسل الكسولة وصفةً للعمل، لكنها لا تنفّذها. ويؤدي أسلوب نهائي مثل first أو to_a أو force إلى بدء التنفيذ.
chain = (1..Float::INFINITY).lazy.map { |n| n * n }
puts "Nothing computed yet"
p chain.first(4)فرض النتائج
يحوّل force (الاسم البديل to_a) سلسلة كسولة محدودة إلى مصفوفة.
result = (1..20).lazy.select(&:odd?).first(5)
p result
all = (1..6).lazy.map { |n| n * 10 }.force
p allربط العمليات بطريقة كسولة
تتداخل العمليات الكسولة المتعددة لكل عنصر بدلًا من تنفيذها كمرور كامل منفصل. وتمر كل قيمة عبر السلسلة بأكملها قبل بدء معالجة القيمة التالية.
result = (1..Float::INFINITY)
.lazy
.map { |n| n * n }
.select { |n| n.even? }
.first(4)
p resulttake وtake_while
يتوقف take وtake_while الكسولان عن سحب القيم بمجرد تحقق الشرط الخاص بهما.
result = (1..Float::INFINITY).lazy.take_while { |n| n < 6 }.to_a
p resultالتسلسلات اللانهائية
تتألق العدّادات الكسولة مع المولّدات. ويمكن دمجها مع Enumerator لنمذجة التدفقات التي لا تنتهي.
naturals = Enumerator.new do |y|
n = 1
loop { y << n; n += 1 }
end
p naturals.lazy.map { |x| x * 3 }.first(5)كفاءة الذاكرة
بما أنّ السلاسل الكسولة لا تنشئ المجموعة الوسيطة الكاملة في الذاكرة، فإنها توفّر الذاكرة عند تصفية بيانات كبيرة للوصول إلى عدد قليل من النتائج.
big = (1..1_000_000).lazy
first_match = big.select { |n| n % 7 == 0 && n % 11 == 0 }.first
puts first_matchمتى تستخدمون lazy
استخدموا lazy عندما:
- يكون المصدر لا نهائيًا أو كبيرًا جدًا.
- تحتاجون إلى عدد قليل من النتائج فقط.
- تريدون تجنّب المصفوفات الوسيطة الكبيرة.
أما مع المجموعات الصغيرة، فالأساليب الفورية أبسط وسريعة بما يكفي.
fizz = (1..Float::INFINITY).lazy.select { |n| n % 3 == 0 }.first(5)
p fizzتجميع المفاهيم
تؤجّل العدّادات الكسولة التنفيذ:
- يجعل
.lazyالسلسلة كسولة. - لا يبدأ التنفيذ إلا عندما يسحب أسلوب نهائي القيم.
- وهي مثالية للتسلسلات اللانهائية أو الضخمة.
squares = (1..Float::INFINITY).lazy.map { |n| n * n }
p squares.select(&:odd?).first(4)اختبار سريع
اختبروا فهمكم للعدّادات الكسولة.
مراجعة
تعلّمتم العدّادات الكسولة:
- يؤجّل
.lazyالحساب. - تبدأ الأساليب النهائية (
firstوto_aوforce) التنفيذ. - تمر كل قيمة عبر السلسلة بأكملها عند الطلب.
- وهي مثالية للتسلسلات اللانهائية أو الكبيرة.
p (1..Float::INFINITY).lazy.select(&:even?).map { |n| n + 1 }.first(3)الأسئلة الشائعة
هل درس «Enumerators كسولة» مجاني؟
نعم — نص درس «Enumerators كسولة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Ruby Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Ruby Academy 4 دروس في المجموع.
ماذا ستتعلم في «Enumerators كسولة»؟
التقييم الكسول تتمرن على Ruby Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Ruby Academy؟
لا تُشترط خبرة سابقة. Ruby Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «Enumerators كسولة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Ruby Academy هذا؟
نعم. كل درس في Ruby Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- كتابة each مخصصة
- تضمين Enumerable
- Enumerators كسولة
- كائنات Enumerator