0Pricing
Ruby Academy · درس

prepend وحلّ الدوال

سلاسل الأسلاف

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

سلاسل الأسلاف

عند استدعاء أسلوب، يبحث Ruby في قائمة تُسمّى سلسلة الأسلاف. يفوز أول تعريف مطابق. ويساعد فهم هذه السلسلة على توضيح كيفية تفاعل mixins مع الوراثة.

class Animal; end
class Dog < Animal; end
p Dog.ancestors

ترتيب البحث عن الأساليب

يبحث Ruby أولًا في فئة الكائن، ثم في الوحدات التي أُدرجت فيها، ثم في الفئة الأب، وهكذا صعودًا في السلسلة حتى يعثر على الأسلوب.

module M
  def hello; "from module"; end
end
class C
  include M
  def hello; "from class"; end
end
puts C.new.hello

يأتي include أسفل الفئة

تأتي الوحدة التي جرى include لها أسفل الفئة مباشرةً في السلسلة. وتكون أساليب الفئة نفسها ذات أولوية على أساليب الوحدة.

module M; end
class C
  include M
end
p C.ancestors  # [C, M, Object, ...]

تعرّفوا على prepend

يُدرج prepend وحدةً أعلى الفئة في السلسلة. وبذلك يُعثَر على أساليب الوحدة أولًا، قبل أساليب الفئة نفسها.

module M
  def hello; "from module"; end
end
class C
  prepend M
  def hello; "from class"; end
end
puts C.new.hello

prepend في السلسلة

افحصوا الأسلاف لتروا كيف يضع prepend الوحدة قبل الفئة.

module M; end
class C
  prepend M
end
p C.ancestors  # [M, C, Object, ...]

استخدام super من وحدة مسبوقة

بما أنّ الوحدة المُضافة باستخدام prepend تعمل أولًا، يمكنها إحاطة أسلوب الفئة باستدعاء super للوصول إلى الأسلوب الأصلي. وهذا مثالي لإضافة سلوك حول السلوك الحالي.

module Logged
  def save
    puts "before save"
    result = super
    puts "after save"
    result
  end
end
class Record
  prepend Logged
  def save
    puts "saving record"
    :ok
  end
end
p Record.new.save

super في mixins

يتبع super سلسلة الأسلاف. فمن داخل وحدة مُدرجة، يصل super إلى الفئة الأب؛ ومن داخل وحدة مسبوقة، يصل إلى الفئة نفسها.

module Polite
  def greet; "Hi! " + super; end
end
class Person
  prepend Polite
  def greet; "I am here."; end
end
puts Person.new.greet

إحاطة الأساليب دون تعديلها

يتيح لكم prepend إضافة سلوك حول الأساليب الموجودة دون تعديل شفرة الفئة الأصلية، وهو بديل نظيف عن monkey-patching.

module Timing
  def compute(n)
    puts "start"
    super
  end
end
class Calc
  prepend Timing
  def compute(n); n * n; end
end
puts Calc.new.compute(5)

ترتيب الوحدات المتعددة

عند إدراج عدة وحدات، تكون آخر وحدة أُدرجت الأقرب إلى الفئة، ويُبحث فيها أولًا.

module A; def who; "A"; end; end
module B; def who; "B"; end; end
class C
  include A
  include B
end
puts C.new.who  # B wins (included last)
p C.ancestors

ملخص include وprepend

جنبًا إلى جنب:

  • include M: تكون السلسلة [Class, M, ...] — وتفوز أساليب الفئة.
  • prepend M: تكون السلسلة [M, Class, ...] — وتفوز أساليب الوحدة، ويمكنها استخدام super للوصول إلى الفئة.
module M; end
class Inc; include M; end
class Pre; prepend M; end
p Inc.ancestors
p Pre.ancestors

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

يتبع حلّ الأساليب سلسلة الأسلاف:

  • تتغلب أساليب الفئة على الوحدات المُدرجة.
  • تتغلب الوحدات المسبوقة على الفئة.
  • ينتقل super خطوة واحدة إلى أعلى السلسلة.
module Cap
  def name; super.capitalize; end
end
class User
  prepend Cap
  def name; "ada"; end
end
puts User.new.name

اختبار سريع

اختبروا فهمكم لحلّ الأساليب.

مراجعة

تعلّمتم حلّ الأساليب:

  • يبحث Ruby في سلسلة الأسلاف من الأعلى إلى الأسفل.
  • يأتي include أسفل الفئة، بينما يأتي prepend أعلاها.
  • يصل super إلى التعريف التالي في أعلى السلسلة.
  • يُحيط prepend بالأساليب بطريقة نظيفة.
module Loud
  def speak; super.upcase; end
end
class Bot
  prepend Loud
  def speak; "beep"; end
end
puts Bot.new.speak

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

هل درس «prepend وحلّ الدوال» مجاني؟

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

ماذا ستتعلم في «prepend وحلّ الدوال»؟

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

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

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

كم من الوقت يستغرق درس «prepend وحلّ الدوال»؟

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

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

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

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

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