النقطة مقابل النقطتين
جزء من قسم Object Oriented Programming في رحلة 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
-- خطأ: الاستدعاء باستخدام النقطتين الرأسيتين (colon) يمرر game مرتين
game:reset() -- self تستقبل game، ولكن يُتوقع أيضاً وسيط nil إضافيبينما قد تعمل هذه الحالة المحددة، إلا أنها تسبب ارتباكاً ويمكن أن تؤدي إلى تعطل الدوال التي تتوقع وسائط معينة. النهج الأكثر أماناً هو الحفاظ على الاتساق: استخدم النقطتين الرأسيتين لكل من التعريف والاستدعاء عندما تحتاج الدالة إلى self، واستخدم النقطة عندما لا تحتاج إليها.
التحدي
سهلأنشئ جدولاً باسم player يحتوي على حقل score مهيأ بالقيمة 0.
أضف دالتين إلى الجدول:
player.setScore(self, value)- يتم تعريفها باستخدام dot syntax ومعاملselfصريح. تقوم بتعيينself.scoreإلى القيمة المعطاة.player:addBonus(amount)- يتم تعريفها باستخدام colon syntax. تقوم بإضافةamountإلىself.score.
ستتلقى مدخلين:
- قيمة النتيجة الأولية
- مبلغ المكافأة المراد إضافته
قم بتنفيذ الخطوات التالية:
- استدعِ
setScoreباستخدام dot syntax (مع تمرير الجدول كمعامل أول) لتعيين النتيجة الأولية - استدعِ
addBonusباستخدام colon syntax لإضافة المكافأة - اطبع القيمة النهائية لـ
player.score
تذكر: طابق طريقة استدعاء كل دالة مع طريقة تعريفها.
ورقة مرجعية
عند تعريف واستدعاء الدوال (methods) في Lua، يجب أن يتطابق بناء الجملة (syntax):
- إذا قمت بالتعريف باستخدام النقطتين الرأسيتين (
:)، فاستدعِها باستخدام النقطتين الرأسيتين - إذا قمت بالتعريف باستخدام النقطة (
.) وكلمةselfصريحة، فاستدعِها باستخدام النقطة ومرر الجدول (table)
استخدام غير صحيح - الاستدعاء بالنقطة عند التعريف بالنقطتين الرأسيتين:
function game:addPoints(points)
self.score = self.score + points
end
game.addPoints(10) -- Error! self becomes 10, not the tableاستخدام غير صحيح - الاستدعاء بالنقطتين الرأسيتين عند التعريف بالنقطة:
function game.reset(self)
self.score = 0
end
game:reset() -- Confusing: passes game automatically but may cause issuesالاستخدام الصحيح - تطابق بناء الجملة:
-- Define with colon, call with colon
function game:addPoints(points)
self.score = self.score + points
end
game:addPoints(10)
-- Define with dot, call with dot
function game.reset(self)
self.score = 0
end
game.reset(game)جرّب بنفسك
-- قراءة المدخلات
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)يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال