في Lua، لا يمكنك استدعاء الوظائف الموجودة في ال metatable داخل ال metatable نفسه. في الحقيقة، الجملة t:Sound()
تحاول البحث عن دالة بإسم “Sound” داخل الجدول t
نفسه، ولكن لا توجد دالة بهذا الاسم في t
.
ومع ذلك، يمكنك تحقيق هذا السلوك عن طريق استخدام النقطة في تعريف الجدول، بحيث يمكنك الوصول إلى الجدول نفسه داخل ال metatable، وهذا يسمح لك باستدعاء الوظائف التي تم تعريفها في ال metatable نفسه. فيما يلي كيفية تعديل الكود ليعمل كما تريد:
-
أفضل لغات البرمجة لتتعلمها في 202324/10/2023
-
إلغاء وظائف DispatchQueue في Swift 304/04/2024
-
كيفية تعامل Kotlin مع الوحدة في Java04/03/2024
lualocal t = {}
local mt = {
__index = {
dog = function() print("bark") end,
sound = function(self) self:dog() end -- استخدم 'self' بدلاً من 't'
}
}
setmetatable(t, mt)
t:sound() -- انتبه إلى الحرف الأول صغير في 'sound'
بهذا التعديل، عند استدعاء t:sound()
، ستقوم الدالة sound
بالبحث عن دالة dog
داخل الجدول t
نفسه وتستدعيها.
المزيد من المعلومات
في Lua، يتم استخدام metatable لتعريف سلوك خاص لجداول Lua. يمكنك تعريف metatable لجدول Lua باستخدام دالة setmetatable()
، ويمكن أن تحتوي هذه ال metatable على مجموعة من المفاتيح الخاصة التي تحدد سلوك الجدول.
واحدة من المفاتيح الرئيسية في metatable هي __index
، والتي تستخدم لتحديد سلوك البحث عن عناصر في الجدول. عندما يتم البحث عن مفتاح في الجدول ولا يتم العثور عليه، يتم التحقق من ال metatable للجدول باستخدام مفتاح __index
للعثور على القيمة المناسبة.
في الكود الذي قدمته، تم تعريف دالة dog
داخل __index
، وهذه الدالة يتم استدعاؤها من داخل الدالة sound
التي تم تعريفها أيضًا داخل __index
. ومن خلال استخدام الـ self
في دالة sound
، يتم الإشارة إلى الجدول نفسه (t
في هذه الحالة)، مما يتيح لك استدعاء دوال metatable من داخل metatable نفسه.