0Pricing
Ruby Academy · درس

تضمين Enumerable

الحصول على map وselect مجانًا

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

الحصول على map وselect مجانًا

بمجرد أن تحتوي فئتكم على each، فإن مزج Enumerable معها يمنحكم فورًا map وselect وreduce وsort وmin وmax والكثير غيرها، وكلها مبنية على each الخاص بكم.

class Bag
  include Enumerable
  def initialize(*x); @x = x; end
  def each; @x.each { |i| yield i }; end
end
p Bag.new(1, 2, 3).map { |n| n * 10 }

العقد

الأمر بسيط: أدرجوا Enumerable وعرّفوا each. يستدعي Enumerable الدالة each الخاصة بكم داخليًا لتشغيل كل ما عداها.

class Squares
  include Enumerable
  def initialize(n); @n = n; end
  def each
    (1..@n).each { |i| yield i * i }
  end
end
p Squares.new(5).to_a

التصفية باستخدام select

يُبقي select على العناصر التي تكون فيها نتيجة الكتلة صحيحة. ويؤدي reject العكس.

class Nums
  include Enumerable
  def initialize(*x); @x = x; end
  def each; @x.each { |i| yield i }; end
end
n = Nums.new(1, 2, 3, 4, 5, 6)
p n.select(&:even?)
p n.reject(&:even?)

التجميع باستخدام reduce

يختزل reduce المجموعة في قيمة واحدة.

class Cart
  include Enumerable
  def initialize(*p); @p = p; end
  def each; @p.each { |i| yield i }; end
end
puts Cart.new(5, 10, 15).reduce(:+)

min وmax وsort

تعمل الأساليب المعتمدة على المقارنة ما دامت عناصر المجموعة قابلة للمقارنة.

class Scores
  include Enumerable
  def initialize(*n); @n = n; end
  def each; @n.each { |i| yield i }; end
end
s = Scores.new(7, 2, 9, 4)
puts s.min
puts s.max
p s.sort

find وinclude?

يعيد find أول عنصر مطابق، بينما يتحقق include? من العضوية.

class Words
  include Enumerable
  def initialize(*w); @w = w; end
  def each; @w.each { |x| yield x }; end
end
w = Words.new("cat", "dog", "bird")
puts w.find { |x| x.length == 4 }
puts w.include?("dog")

group_by وpartition

يوفّر Enumerable أدوات مساعدة قوية لتجميع العناصر.

class Nums
  include Enumerable
  def initialize(*x); @x = x; end
  def each; @x.each { |i| yield i }; end
end
n = Nums.new(1, 2, 3, 4, 5)
p n.group_by(&:even?)
p n.partition(&:odd?)

يتطلب الفرز عناصر قابلة للمقارنة

إذا كانت عناصر المجموعة كائنات مخصّصة، فأضيفوا إليها <=> (عبر Comparable) حتى تعرف sort وmin وmax كيفية ترتيبها.

Item = Struct.new(:price) do
  include Comparable
  def <=>(o); price <=> o.price; end
end
class Shelf
  include Enumerable
  def initialize(*i); @i = i; end
  def each; @i.each { |x| yield x }; end
end
shelf = Shelf.new(Item.new(30), Item.new(10), Item.new(20))
p shelf.min.price

each_with_index

يوفّر Enumerable أيضًا each_with_index وeach_with_object لتكرار أكثر ثراءً.

class Letters
  include Enumerable
  def initialize(*l); @l = l; end
  def each; @l.each { |x| yield x }; end
end
Letters.new("a", "b", "c").each_with_index do |letter, i|
  puts "#{i}: #{letter}"
end

ربط الأساليب

بما أنّ هذه الأساليب تعيد مصفوفات أو عدّادات، يمكنكم ربطها في مسارات واضحة ومعبرة.

class Nums
  include Enumerable
  def initialize(*x); @x = x; end
  def each; @x.each { |i| yield i }; end
end
result = Nums.new(1, 2, 3, 4, 5, 6).select(&:even?).map { |n| n * n }
p result

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

يمثّل إدراج Enumerable مكسبًا كبيرًا:

  • عرّفوا each مرة واحدة.
  • احصلوا على map وselect وreduce وsort وfind وgroup_by والعشرات غيرها.
  • أضيفوا Comparable إلى العناصر لاستخدام أساليب الترتيب.
class Range5
  include Enumerable
  def each; (1..5).each { |n| yield n }; end
end
puts Range5.new.sum

اختبار سريع

اختبروا فهمكم لإدراج Enumerable.

مراجعة

تعلّمتم إدراج Enumerable:

  • عرّفوا each وأدرجوا الوحدة لتحصلوا على مجموعة الأدوات كاملة.
  • تعمل map وselect وreduce وfind وgroup_by بالاعتماد على each الخاص بكم.
  • يتطلب ترتيب العناصر وجود <=>.
  • يمكن ربط الأساليب في مسارات متتابعة.
class Tens
  include Enumerable
  def each; [10, 20, 30].each { |n| yield n }; end
end
p Tens.new.map { |n| n + 1 }

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

هل درس «تضمين Enumerable» مجاني؟

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

ماذا ستتعلم في «تضمين Enumerable»؟

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

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

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

كم من الوقت يستغرق درس «تضمين Enumerable»؟

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

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

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

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

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