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.helloprepend في السلسلة
افحصوا الأسلاف لتروا كيف يضع 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.savesuper في 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعريف Modules
- include وextend
- Comparable وEnumerable
- prepend وحلّ الدوال