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

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

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

challenge icon

التحدي

سهل

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

أضف دالتين إلى الجدول:

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

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

  1. قيمة النتيجة الأولية
  2. مبلغ المكافأة المراد إضافته

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

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

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

جميع دروس Object Oriented Programming