'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بينما يعمل تمرير الجدول يدويًا، فقد يبدو الأمر تكراريًا. في الدرس القادم، ستتعلم صيغة أكثر ترتيباً تتعامل مع هذا تلقائيًا.
التحدي
سهلقم بإنشاء جدول باسم tracker يحتوي على حقل count مهيأ بالقيمة 0.
أضف دالة tracker.addAmount(self, amount) تقوم بما يلي:
- تقبل
self(الجدول) كمعامل أول - تقبل
amountكمعامل ثانٍ - تضيف
amountإلىself.count
ستتلقى مدخلين:
- المبلغ الأول المراد إضافته
- المبلغ الثاني المراد إضافته
استدعِ 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)يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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 للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال