النقطة مقابل النقطتين
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy — الدرس 4 من 70.
الآن بعد أن عرفت كلاً من بناء جملة النقطة والنقطتين الرأسيتين، من الضروري فهم متى تستخدم كل منهما—وماذا يحدث عندما تخلط بينهما بشكل غير صحيح.
القاعدة الأساسية بسيطة: يجب أن تتطابق طريقة تعريفك للدالة مع طريقة استدعائك لها. إذا قمت بالتعريف باستخدام النقطتين الرأسيتين، فاستدعِها باستخدام النقطتين الرأسيتين. إذا قمت بالتعريف باستخدام النقطة و self صريحة، فاستدعِها باستخدام النقطة ومرر الجدول.
إليك ما يحدث عند عدم المطابقة بينهما:
local game = { score = 0 }
function game:addPoints(points)
self.score = self.score + points
end
-- خطأ: الاستدعاء باستخدام النقطة، ولكن لم يتم تمرير جدول
game.addPoints(10) -- خطأ! self الآن هي 10، وليست الجدولعندما تستدعي game.addPoints(10)، لا تقوم Lua بتمرير game تلقائياً. تصبح القيمة 10 هي self، مما يتسبب في سلوك غير متوقع أو أخطاء.
الاتجاه المعاكس أكثر تسامحاً:
function game.reset(self)
self.score = 0
end
-- الاستدعاء باستخدام النقطتين الرأسيتين: game:reset() هو نفسه game.reset(game)
game:reset() -- تستقبل self الكائن game بشكل صحيح، لذا فإن هذا يعملبينما قد تنجح هذه الحالة المحددة، إلا أنها تسبب ارتباكاً ويمكن أن تؤدي إلى تعطل الدوال التي تتوقع وسائط معينة. النهج الأكثر أماناً هو الحفاظ على الاتساق: استخدم النقطتين الرأسيتين لكل من التعريف والاستدعاء عندما تحتاج الدالة إلى self، واستخدم النقطة عندما لا تحتاج إليها.
التحدي
سهلقم بإنشاء جدول باسم player يحتوي على حقل score تم تهيئته بالقيمة 0.
أضف وظيفتين (functions) إلى الجدول:
player.setScore(self, value)- يتم تعريفها باستخدام dot syntax ومعاملselfصريح. تقوم بتعيينself.scoreإلى القيمة المعطاة.player:addBonus(amount)- يتم تعريفها باستخدام colon syntax. تقوم بإضافةamountإلىself.score.
ستتلقى مدخلين:
- قيمة النتيجة الأولية (initial score)
- مبلغ المكافأة (bonus amount) المراد إضافته
قم بتنفيذ الخطوات التالية:
- استدعِ
setScoreباستخدام dot syntax (مع تمرير الجدول كمعامل أول) لتعيين النتيجة الأولية - استدعِ
addBonusباستخدام colon syntax لإضافة المكافأة - اطبع القيمة النهائية لـ
player.score
تذكر: طابق طريقة استدعاء كل وظيفة مع طريقة تعريفها.
جرّب بنفسك
-- قراءة المدخلات
local initialScore = tonumber(io.read())
local bonusAmount = tonumber(io.read())
-- TODO: اكتب الكود الخاص بك أدناه
-- 1. أنشئ جدولاً باسم 'player' يحتوي على حقل 'score' بقيمة أولية 0
-- 2. أضف player.setScore(self, value) باستخدام صيغة النقطة مع self صريحة
-- 3. أضف player:addBonus(amount) باستخدام صيغة النقطتين الرأسيتين
-- 4. استدعِ setScore باستخدام صيغة النقطة (مع تمرير الجدول كمعامل أول)
-- 5. استدعِ addBonus باستخدام صيغة النقطتين الرأسيتين
-- طباعة النتيجة النهائية
print(player.score)يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال