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