Comparable وEnumerable
Mixins قياسية
Comparable وEnumerable درس مجاني في Ruby Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Ruby Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Ruby Academy 4 دروس في المجموع.
Mixins القياسية
توفّر Ruby وحدات قوية يمكنكم مزجها في أصنافكم الخاصة. ومن أبرزها Comparable وEnumerable. ويمنح كل منهما العديد من الطرائق مقابل تنفيذ طريقة واحدة فقط.
puts Comparable.instance_methods.sort.inspectيحتاج Comparable إلى <=>
يتطلّب Comparable منكم تعريف عامل المركبة الفضائية <=>، الذي يعيد -1 أو 0 أو 1. وفي المقابل تحصلون على < و<= و== و> و>= وbetween?.
class Weight
include Comparable
attr_reader :grams
def initialize(g); @grams = g; end
def <=>(other); grams <=> other.grams; end
end
puts Weight.new(50) < Weight.new(80)طرائق المقارنة مجانًا
بعد تعريف عامل واحد، تعمل جميع طرائق المقارنة تلقائيًا.
class Weight
include Comparable
attr_reader :grams
def initialize(g); @grams = g; end
def <=>(other); grams <=> other.grams; end
end
a = Weight.new(100)
b = Weight.new(100)
puts a == b
puts Weight.new(30).between?(Weight.new(10), Weight.new(50))clamp من Comparable
يوفّر Comparable أيضًا clamp، التي تحافظ على القيمة ضمن نطاق معيّن.
puts 15.clamp(0, 10)
puts (-5).clamp(0, 10)
puts 7.clamp(0, 10)فرز كائنات Comparable
بما أنّ <=> مُعرّفة، يمكن فرز مصفوفة من كائناتكم تلقائيًا.
class Weight
include Comparable
attr_reader :grams
def initialize(g); @grams = g; end
def <=>(other); grams <=> other.grams; end
def to_s; "#{grams}g"; end
end
list = [Weight.new(30), Weight.new(10), Weight.new(20)]
puts list.sort.map(&:to_s).inspectEnumerable يحتاج إلى each
يتطلّب Enumerable أن تعرّفوا each. وفي المقابل تحصلون على map وselect وreduce وmin وmax وsort والعشرات غيرها.
class TodoList
include Enumerable
def initialize(*items); @items = items; end
def each(&block); @items.each(&block); end
end
list = TodoList.new("buy milk", "call mom")
puts list.map(&:upcase).inspectالتجميع مجانًا
بعد تعريف each، تصبح أساليب التجميع مثل count وmin وinclude? متاحة.
class Scores
include Enumerable
def initialize(*n); @n = n; end
def each(&block); @n.each(&block); end
end
s = Scores.new(8, 3, 9, 4)
puts s.max
puts s.min
puts s.countselect وreject
تتوفّر أيضًا أساليب التصفية.
class Numbers
include Enumerable
def initialize(*n); @n = n; end
def each(&block); @n.each(&block); end
end
nums = Numbers.new(1, 2, 3, 4, 5, 6)
p nums.select(&:even?)
p nums.reject(&:even?)استخدام reduce لحساب الإجماليات
يجمع reduce (الاسم البديل inject) العناصر معًا، مثل جمع قيمها.
class Basket
include Enumerable
def initialize(*p); @p = p; end
def each(&block); @p.each(&block); end
end
b = Basket.new(10, 20, 30)
puts b.reduce(0) { |sum, price| sum + price }دمج كلا الـ mixin
أضيفوا Comparable للفرز وEnumerable للتكرار، وستبدو فئتكم كأنها مجموعة مضمّنة في اللغة.
class Playlist
include Enumerable
def initialize(*songs); @songs = songs; end
def each(&block); @songs.each(&block); end
end
pl = Playlist.new("c", "a", "b")
puts pl.sort.inspect
puts pl.firstتجميع المفاهيم
تمنحكم mixins القياسية قدرًا كبيرًا من الوظائف مقابل عقد صغير:
Comparable: عرّفوا<=>لتحصلوا على جميع عمليات المقارنة.Enumerable: عرّفواeachلتحصلوا على مجموعة أدوات المجموعات كاملة.
class Bag
include Enumerable
def initialize(*x); @x = x; end
def each(&b); @x.each(&b); end
end
puts Bag.new(3, 1, 2).sort.inspectاختبار سريع
اختبروا فهمكم لـ mixins القياسية.
مراجعة
تعلّمتم mixins القياسية:
- يحتاج
Comparableإلى<=>، ويوفّر المقارنة وclampوbetween?. - يحتاج
Enumerableإلىeach، ويوفّر map وselect وreduce وmin وmax وغيرها. - تجعل هذه العناصر معًا الفئات المخصّصة تبدو أصلية في اللغة.
class Temp
include Comparable
attr_reader :deg
def initialize(d); @deg = d; end
def <=>(o); deg <=> o.deg; end
end
puts Temp.new(20) > Temp.new(15)الأسئلة الشائعة
هل درس «Comparable وEnumerable» مجاني؟
نعم — نص درس «Comparable وEnumerable» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Ruby Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Ruby Academy 4 دروس في المجموع.
ماذا ستتعلم في «Comparable وEnumerable»؟
Mixins قياسية تتمرن على Ruby Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Ruby Academy؟
لا تُشترط خبرة سابقة. Ruby Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «Comparable وEnumerable»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Ruby Academy هذا؟
نعم. كل درس في Ruby Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعريف Modules
- include وextend
- Comparable وEnumerable
- prepend وحلّ الدوال