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

'self' الصريح

جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 2 من 70.

عندما توجد دالة داخل جدول، فإنها غالباً ما تحتاج إلى الوصول إلى البيانات الموجودة داخل ذلك الجدول نفسه أو تعديلها. ولكن هنا تكمن المشكلة: كيف تعرف الدالة إلى أي جدول تنتمي؟

الحل هو تمرير الجدول صراحةً كمعامل أول للدالة. حسب العرف، يُسمى هذا المعامل self:

local counter = {
    value = 0
}

function counter.increment(self)
    self.value = self.value + 1
end

counter.increment(counter)
print(counter.value)  -- النتيجة: 1

لاحظ كيف نستدعي counter.increment(counter)، مع تمرير الجدول نفسه كمعامل. داخل الدالة، self يشير الآن إلى ذلك الجدول، مما يسمح لنا بقراءة وتعديل self.value.

هذا النمط ضروري لأنه يسمح للدالة بالعمل مع بيانات الجدول دون كتابة اسم الجدول بشكل ثابت في الكود. لننظر في دالة تقوم بإعادة تعيين وإرجاع العداد الحالي:

function counter.reset(self)
    local old = self.value
    self.value = 0
    return old
end

print(counter.reset(counter))  -- الناتج: 1
print(counter.value)           -- الناتج: 0

بينما يعمل تمرير الجدول يدويًا، فقد يبدو الأمر تكراريًا. في الدرس القادم، ستتعلم صيغة أكثر ترتيباً تتعامل مع هذا تلقائيًا.

challenge icon

التحدي

سهل

قم بإنشاء جدول باسم tracker يحتوي على حقل count مهيأ بالقيمة 0.

أضف دالة tracker.addAmount(self, amount) تقوم بما يلي:

  • تقبل self (الجدول) كمعامل أول
  • تقبل amount كمعامل ثانٍ
  • تضيف amount إلى self.count

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

  1. المبلغ الأول المراد إضافته
  2. المبلغ الثاني المراد إضافته

استدعِ tracker.addAmount مرتين (مرة لكل مدخل)، مع تمرير الجدول كمعامل أول في كل مرة. بعد كلا الاستدعاءين، اطبع القيمة النهائية لـ tracker.count.

ورقة مرجعية

يمكن للوظائف (Functions) الموجودة داخل الجداول الوصول إلى بيانات الجدول من خلال استقبال الجدول كمعامل أول لها، والذي يُسمى اصطلاحاً self:

local counter = {
    value = 0
}

function counter.increment(self)
    self.value = self.value + 1
end

counter.increment(counter)  -- تمرير الجدول كمعامل
print(counter.value)  -- المخرج: 1

يسمح المعامل self للوظيفة بقراءة وتعديل حقول الجدول دون كتابة اسم الجدول بشكل صريح (hardcoding):

function counter.reset(self)
    local old = self.value
    self.value = 0
    return old
end

print(counter.reset(counter))  -- المخرج: 1
print(counter.value)           -- المخرج: 0

يمكن للوظائف قبول معاملات إضافية بعد self:

function counter.add(self, amount)
    self.value = self.value + amount
end

counter.add(counter, 5)

جرّب بنفسك

-- قراءة المدخلات
local amount1 = tonumber(io.read())
local amount2 = tonumber(io.read())

-- TODO: اكتب كودك أدناه
-- أنشئ جدولاً باسم 'tracker' مع حقل 'count' مهيأ بالقيمة 0
-- أضف دالة tracker.addAmount(self, amount) التي تضيف amount إلى self.count
-- استدعِ tracker.addAmount مرتين مع تمرير الجدول كمعامل أول


-- طباعة المجموع النهائي
print(tracker.count)
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming