0Pricing
Ruby Academy · درس

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).inspect

Enumerable يحتاج إلى 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.count

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

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

  1. تعريف Modules
  2. include وextend
  3. Comparable وEnumerable
  4. prepend وحلّ الدوال
← العودة إلى Ruby Academy