Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

النقطة مقابل النقطتين

جزء من قسم البرمجة كائنية التوجه في رحلة 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، واستخدم النقطة عندما لا تحتاج إليها.

challenge icon

التحدي

سهل

قم بإنشاء جدول باسم player يحتوي على حقل score تم تهيئته بالقيمة 0.

أضف وظيفتين (functions) إلى الجدول:

  1. player.setScore(self, value) - يتم تعريفها باستخدام dot syntax ومعامل self صريح. تقوم بتعيين self.score إلى القيمة المعطاة.
  2. player:addBonus(amount) - يتم تعريفها باستخدام colon syntax. تقوم بإضافة amount إلى self.score.

ستتلقى مدخلين:

  1. قيمة النتيجة الأولية (initial score)
  2. مبلغ المكافأة (bonus amount) المراد إضافته

قم بتنفيذ الخطوات التالية:

  1. استدعِ setScore باستخدام dot syntax (مع تمرير الجدول كمعامل أول) لتعيين النتيجة الأولية
  2. استدعِ addBonus باستخدام colon syntax لإضافة المكافأة
  3. اطبع القيمة النهائية لـ 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)
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه