كتابة 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- كتابة each مخصصة
- تضمين Enumerable
- Enumerators كسولة
- كائنات Enumerator