البرمجة

كيفية استدعاء وظائف metatable في Lua

في Lua، لا يمكنك استدعاء الوظائف الموجودة في ال metatable داخل ال metatable نفسه. في الحقيقة، الجملة t:Sound() تحاول البحث عن دالة بإسم “Sound” داخل الجدول t نفسه، ولكن لا توجد دالة بهذا الاسم في t.

ومع ذلك، يمكنك تحقيق هذا السلوك عن طريق استخدام النقطة في تعريف الجدول، بحيث يمكنك الوصول إلى الجدول نفسه داخل ال metatable، وهذا يسمح لك باستدعاء الوظائف التي تم تعريفها في ال metatable نفسه. فيما يلي كيفية تعديل الكود ليعمل كما تريد:

lua
local 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 نفسه.

زر الذهاب إلى الأعلى