0Pricing
Ruby Academy · درس

كتابة each مخصصة

تنفيذ التكرار

كتابة each مخصصة درس مجاني في Ruby Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Ruby Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Ruby Academy 4 دروس في المجموع.

تنفيذ التكرار

يدور التكرار في Ruby حول أسلوب واحد هو each. وبكتابة each الخاص بكم، تحددون كيفية اجتياز المجموعة وتفتحون المجال أمام منظومة التكرار بأكملها.

class Trio
  def each
    yield 1
    yield 2
    yield 3
  end
end
Trio.new.each { |n| puts n }

يُمرّر each القيم

داخل each، استدعوا yield مرة واحدة لكل عنصر. وتتلقى الكتلة التي يمرّرها المستدعي كل قيمة بالتتابع.

class Days
  NAMES = ["Mon", "Tue", "Wed"]
  def each
    NAMES.each { |d| yield d }
  end
end
Days.new.each { |day| puts day }

تخزين البيانات الداخلية

عادةً ما يجتاز each البيانات المحفوظة في متغيّر مثيل.

class Stack
  def initialize
    @items = []
  end
  def push(x); @items << x; self; end
  def each
    @items.each { |i| yield i }
  end
end
s = Stack.new
s.push(10).push(20)
s.each { |x| puts x }

ترتيب اجتياز مخصّص

يمكن لـ each الخاص بكم التكرار بأي ترتيب تختارونه، مثل الترتيب العكسي.

class Reversed
  def initialize(arr); @arr = arr; end
  def each
    i = @arr.length - 1
    while i >= 0
      yield @arr[i]
      i -= 1
    end
  end
end
Reversed.new([1, 2, 3]).each { |x| puts x }

تمرير قيم متعددة

يمكن لـ yield تمرير أكثر من قيمة، وتتلقاها الكتلة في صورة معاملات متعددة، مثل مفتاح القيمة وقيمتها في التجزئة.

class Pairs
  def each
    yield :a, 1
    yield :b, 2
  end
end
Pairs.new.each { |key, value| puts "#{key}=#{value}" }

يعيد each الكائن self

وفقًا للعرف، يعيد each المجموعة نفسها حتى يمكن ربط الاستدعاءات. ويتوافق إرجاع self من each مع السلوك المضمّن في Ruby.

class Box
  def initialize(*x); @x = x; end
  def each
    @x.each { |i| yield i }
    self
  end
end
result = Box.new(1, 2).each { |i| }
puts result.class

استخدام block_given?

تحقّقوا من عدم غياب الكتلة حتى لا يتسبب استدعاء each دون كتلة في تعطل البرنامج، وغالبًا ما يكون ذلك بإرجاع عدّاد (سنغطيه لاحقًا).

class List
  def initialize(*x); @x = x; end
  def each
    return @x.to_enum unless block_given?
    @x.each { |i| yield i }
  end
end
puts List.new(5, 6).each.class

بناء أساليب أخرى عليه

بمجرد وجود each، يمكنكم بناء أساليب أخرى بالاعتماد عليه داخل الفئة نفسها.

class Numbers
  def initialize(*n); @n = n; end
  def each; @n.each { |i| yield i }; end
  def total
    sum = 0
    each { |i| sum += i }
    sum
  end
end
puts Numbers.new(1, 2, 3, 4).total

تسلسلات محسوبة

لا يحتاج each إلى تخزين أي شيء؛ إذ يمكنه توليد القيم أثناء التشغيل.

class Evens
  def initialize(limit); @limit = limit; end
  def each
    n = 0
    while n <= @limit
      yield n
      n += 2
    end
  end
end
Evens.new(8).each { |x| puts x }

الأساس لـ Enumerable

يمثّل each الخاص بكم اللبنة الأساسية الوحيدة التي يحتاج إليها Enumerable. وفي الدرس التالي ستدرجونه لتحصلوا مجانًا على عشرات الأساليب.

class Range3
  def each
    (1..3).each { |n| yield n }
  end
end
Range3.new.each { |n| print n }
puts

تجميع المفاهيم

يمنحكم each المخصّص تحكمًا كاملًا في التكرار:

  • استدعاء yield مرة لكل عنصر.
  • الاجتياز بأي ترتيب، أو توليد القيم، أو تمرير أزواج.
  • إرجاع self وفقًا للعرف.
class Countdown
  def initialize(from); @from = from; end
  def each
    @from.downto(1) { |n| yield n }
  end
end
Countdown.new(3).each { |n| puts n }

اختبار سريع

اختبروا فهمكم لـ each المخصّص.

مراجعة

تعلّمتم كتابة each مخصّص:

  • يمرّر yield العناصر إلى كتلة المستدعي.
  • تتحكمون في ترتيب الاجتياز، ويمكنكم توليد القيم.
  • إرجاع self وفقًا للعرف.
  • يمثّل each الأساس لـ Enumerable.
class Squares
  def initialize(n); @n = n; end
  def each
    (1..@n).each { |i| yield i * i }
  end
end
Squares.new(4).each { |sq| puts sq }

الأسئلة الشائعة

هل درس «كتابة each مخصصة» مجاني؟

نعم — نص درس «كتابة each مخصصة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Ruby Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Ruby Academy 4 دروس في المجموع.

ماذا ستتعلم في «كتابة each مخصصة»؟

تنفيذ التكرار تتمرن على Ruby Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Ruby Academy؟

لا تُشترط خبرة سابقة. Ruby Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «كتابة each مخصصة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Ruby Academy هذا؟

نعم. كل درس في Ruby Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. كتابة each مخصصة
  2. تضمين Enumerable
  3. Enumerators كسولة
  4. كائنات Enumerator
← العودة إلى Ruby Academy