النقطة مقابل النقطتين
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 4 من 70.
والآن بعد أن عرفت صياغة النقطة والنقطتين، إليك العلاقة بينهما وما يحدث خطأً عندما لا يُمرَّر الجدول.
النقطتان الرأسيتان كلتاهما اختصار. تعريف function game:addPoints(points) هو نفسه تعريف function game.addPoints(self, points)، واستدعاء game:addPoints(10) هو نفسه استدعاء game.addPoints(game, 10). تعمل الدالة التابعة ما دام الجدول يصل إليها بوصفه وسيطها الأول.
إليك ما يحدث عندما لا يتم تمرير الجدول:
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، ويفشل self.score لأن 10 عدد، وليس جدولًا.
تعمل الدالة المعرّفة بنقطة وبوسيط self صريح عند استدعائها بنقطتين، لأن النقطتين تمرّران الجدول بوصفه الوسيط الأول:
function game.reset(self)
self.score = 0
end
-- الاستدعاء باستخدام النقطتين: game:reset() هو نفسه game.reset(game)
game:reset() -- يتلقى self القيمة game بشكل صحيح، لذا يعمل هذاينشئ التعريفان الدالة نفسها، لذا فالاختيار اصطلاح: استخدم النقطتين لتعريف الدوال التي تعمل على self واستدعائها، والنقطة للدوال التي لا تستخدم self. عندئذٍ يوضّح كل استدعاء ما إذا كان الجدول مُمرَّرًا.
التحدي
سهلأنشئ جدولًا باسم player يحتوي على حقل score وقيمته الابتدائية 0.
أضف دالتين إلى الجدول:
player.setScore(self, value)- تُعرَّف باستخدام صياغة النقطة ومعاملselfصريح. تعيّنself.scoreإلى القيمة المحددة.player:addBonus(amount)- تُعرَّف باستخدام صياغة النقطتين. تضيفamountإلىself.score.
ستتلقى مُدخلَين:
- قيمة النتيجة الابتدائية
- مقدار المكافأة المراد إضافته
نفّذ الخطوات التالية:
- استدعِ
setScoreباستخدام صياغة النقطة (مع تمرير الجدول باعتباره الوسيط الأول) لتعيين النتيجة الابتدائية - استدعِ
addBonusباستخدام صياغة النقطتين لإضافة المكافأة - اطبع القيمة النهائية لـ
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 للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكالتدرّب بنفسك: مترجم Lua عبر الإنترنت