تعريف المتغيرات في Lua
افهم الفرق بين المتغيرات العامة والمحلية واصطلاحات التسمية
تعريف المتغيرات في Lua درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
المتغيرات العامة في مقابل المحلية
تكون المتغيرات في Lua عامة افتراضيًا. تؤدي كتابة x = 10 دون الكلمة المفتاحية local إلى إنشاء متغير عام يمكن الوصول إليه من أي مكان. أما استخدام local x = 10 فيقصر المتغير على الكتلة الحالية والكتل المتداخلة فيها.
احرصوا دائمًا على تفضيل local لتحسين الأداء والأمان. فالوصول إلى متغير محلي أسرع من الوصول إلى متغير عام، لأن المتغيرات العامة تتطلب البحث في جدول تجزئة داخل جدول _G.
x = 100 -- global variable
local y = 200 -- local variable
do
local z = 300 -- block-local
print(x, y, z) -- 100 200 300
end
print(x, y) -- 100 200
print(z) -- nil (out of scope)الكلمة المفتاحية local
تعلن الكلمة المفتاحية local عن متغير يقتصر نطاقه على أقرب كتلة محيطة: جسم دالة، أو كتلة do...end، أو جسم حلقة، أو جزء ملف. تُنشأ المتغيرات المحلية في السطر الذي تُعلن فيه، وتتوقف عن الوجود عند نهاية كتلتها.
يمكنكم إعلان عدة متغيرات محلية في سطر واحد وتهيئتها في الوقت نفسه. وتكون قيمة المتغيرات المحلية غير المهيأة nil افتراضيًا.
local a, b, c = 1, 2, 3
print(a, b, c) -- 1 2 3
local d, e = 10 -- e is nil
print(d, e) -- 10 nil
local f -- nil until assigned
f = 42
print(f) -- 42اصطلاحات تسمية المتغيرات
تتبع معرفات Lua القواعد التالية: يجب أن تبدأ بحرف أو شرطة سفلية، ثم تتبعها أحرف أو أرقام أو شرطات سفلية. Lua حساسة لحالة الأحرف، لذلك تُعد Value وvalue وVALUE ثلاثة متغيرات مختلفة.
اصطلاحيًا: استخدموا camelCase أو snake_case للمتغيرات العادية، وUPPER_CASE للثوابت، وأضيفوا شرطة سفلية في بداية حقول الوحدات الخاصة. وتجنبوا الأسماء المكونة من حرف واحد، باستثناء عدادات الحلقات.
local myVariable = 1 -- camelCase
local my_variable = 2 -- snake_case
local MAX_SIZE = 100 -- constant convention
local _private = "hidden" -- private convention
-- Case sensitivity demo
local lua = "lower"
local Lua = "upper"
print(lua, Lua) -- lower upperالجدول العام _G
توجد جميع المتغيرات العامة في Lua داخل جدول خاص يسمى _G. وتكافئ كتابة x = 10 كتابة _G.x = 10. ويمكنكم فحص جميع المتغيرات العامة بالتكرار عبر _G، وهو أمر مفيد لتصحيح الأخطاء لكنه خطر في كود الإنتاج.
في Lua 5.2+، يكون _ENV جدول البيئة الفعلي، ويُهيَّأ _G للإشارة إليه. ويسمح لكم فهم ذلك بعزل الكود عن طريق استبدال _ENV.
myGlobal = 42
print(_G.myGlobal) -- 42
-- Setting via _G is the same as direct assignment
_G.another = "hello"
print(another) -- hello
-- Counting globals (many built-ins exist)
local count = 0
for k in pairs(_G) do count = count + 1 end
print("Globals:", count)الإسناد المتعدد
تدعم Lua الإسناد المتعدد: يمكنكم إسناد قيم إلى عدة متغيرات في عبارة واحدة. يُقيَّم الطرف الأيمن أولًا، ثم تُسنَد القيم من اليسار إلى اليمين. وإذا زاد عدد المتغيرات على عدد القيم، تحصل القيم الزائدة من المتغيرات على nil. وإذا زاد عدد القيم على عدد المتغيرات، تُهمَل القيم الزائدة.
يجعل ذلك تبديل المتغيرات أمرًا بسيطًا دون الحاجة إلى متغير مؤقت.
-- Swap without temp variable
local a, b = 10, 20
a, b = b, a
print(a, b) -- 20 10
-- More variables than values
local x, y, z = 1, 2
print(x, y, z) -- 1 2 nil
-- More values than variables
local p, q = 1, 2, 3 -- 3 is discarded
print(p, q) -- 1 2النطاق وحدود الكتل
محددات الكتل في Lua هي: do...end، وأجسام الدوال، وif/elseif/else...end، وwhile...end، وrepeat...until، وfor...end. ينشئ كل منها مستوى نطاق جديدًا. وتفيد كتل do...end في تقليص النطاق فقط، دون الحاجة إلى أي منطق آخر.
يقتصر نطاق المتغير المحلي المُعلن في رأس حلقة for على جسم الحلقة — ولا يمتد إلى خارجها.
for i = 1, 3 do
local msg = "item " .. i
print(msg)
end
-- print(i) -- would be nil, i is gone
-- print(msg) -- would be nil, msg is gone
-- do...end for manual scoping
do
local temp = expensive_computation or 0
print(temp)
end
-- temp is nil hereالثوابت: اصطلاح local
لا تحتوي Lua على كلمة مفتاحية مضمّنة باسم const. ويقضي الاصطلاح باستخدام أسماء UPPER_CASE مع local للإشارة إلى أن القيمة ينبغي ألا تتغير. كما أن وضع الثوابت في أعلى الوحدة بوصفها متغيرات محلية يلمّح إلى مترجم JIT بأن هذه القيم ثابتة.
لتحقيق عدم قابلية التغيير فعلًا، يمكنكم استخدام جدول وكيل يحتوي على __newindex ويطلق خطأ عند التعديل — وسنغطي ذلك في درس metatables.
local MAX_RETRIES = 3
local PI = 3.14159265358979
local APP_VERSION = "1.0.0"
-- Use them as read-only by convention
local area = PI * 5 * 5
print(area) -- 78.539...
print(MAX_RETRIES) -- 3حجب المتغيرات
يحدث حجب المتغيرات عندما يعلن نطاق داخلي عن متغير محلي بالاسم نفسه لمتغير في نطاق خارجي. ينشئ الإعلان الداخلي متغيرًا جديدًا تمامًا يحجب المتغير الخارجي ضمن نطاقه. ولا يتغير المتغير الخارجي، ويظهر مجددًا بعد انتهاء النطاق الداخلي.
قد يسبب حجب المتغيرات الالتباس؛ لذا فضّلوا استخدام أسماء فريدة عبر النطاقات المتداخلة، مع أنه قد يكون مقصودًا أحيانًا، مثل إعادة استخدام أسماء متغيرات الحلقات في الحلقات المتداخلة.
local x = "outer"
do
local x = "inner" -- shadows outer x
print(x) -- inner
end
print(x) -- outer (unchanged)
local n = 10
for n = 1, 3 do -- loop n shadows outer n
print(n) -- 1, 2, 3
end
print(n) -- 10 (outer unchanged)تجنب تلويث النطاق العام
تُعد المتغيرات العامة غير المقصودة خطأً شائعًا في Lua: إذ يؤدي الخطأ الإملائي في اسم متغير محلي إلى إنشاء متغير عام جديد بصمت. تلتقط الوحدة strict.lua، التي تُضمَّن عادةً في المشاريع، عمليات قراءة المتغيرات العامة وكتابتها دون إعلان، وذلك بإضافة metatable إلى _G.
وهناك طريقة أبسط: استخدموا local دائمًا، وشغّلوا luac -p أو أداة تحليل ثابت مثل luacheck لاكتشاف المتغيرات العامة غير المقصودة قبل وقت التشغيل.
-- Dangerous: typo creates a global silently
local counter = 0
coutner = 5 -- typo! creates global 'coutner'
print(counter) -- 0 (not 5!)
print(coutner) -- 5 (the typo global)
-- Fix: always use local keyword
local score = 0
score = 10 -- assigns to existing local
print(score) -- 10إسناد nil يحذف المتغيرات العامة
يؤدي تعيين nil إلى متغير عام إلى إزالته من _G، مما يحرر الذاكرة. وهذه هي الطريقة الصحيحة لـ"حذف" متغير عام. أما بالنسبة إلى المتغيرات المحلية، فمجرد خروجها من نطاقها يحقق التأثير نفسه — إذ يستعيد جامع القمامة الذاكرة.
انتبهوا عند تمرير nil في إسناد متعدد؛ فقد يؤدي ذلك إلى اقتطاع قائمة الوسائط في بعض السياقات، خصوصًا عند وجود استدعاءات دوال في الطرف الأيمن.
myGlobal = "exists"
print(myGlobal) -- exists
print(_G.myGlobal ~= nil) -- true
myGlobal = nil
print(myGlobal) -- nil
print(_G.myGlobal ~= nil) -- false
-- The entry is removed from _Gتحقق سريع
ما نطاق المتغير المُعلن باستخدام local x = 5 داخل جسم حلقة for؟
مراجعة: إعلان المتغيرات في Lua
أهم النقاط المستفادة من هذا الدرس:
- المتغيرات عامة افتراضيًا — استخدموا
localدائمًا - المتغيرات المحلية أسرع (لا تحتاج إلى البحث في جدول تجزئة) وأكثر أمانًا
- الإسناد المتعدد: يؤدي
a, b = b, aإلى التبديل في سطر واحد - توجد جميع المتغيرات العامة في
_G؛ ويؤدي تعيينnilإليها إلى حذفها - الحجب: يحجب
localالداخلي المتغير الخارجي دون تغييره - استخدموا
UPPER_CASEللثوابت وفقًا للاصطلاح
التالي: المعاملات الحسابية وعوامل المقارنة والعوامل المنطقية.
الأسئلة الشائعة
هل درس «تعريف المتغيرات في Lua» مجاني؟
نعم — نص درس «تعريف المتغيرات في Lua» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «تعريف المتغيرات في Lua»؟
افهم الفرق بين المتغيرات العامة والمحلية واصطلاحات التسمية تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تعريف المتغيرات في Lua»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نظرة عامة على أنواع بيانات Lua
- تعريف المتغيرات في Lua
- المعاملات الحسابية والعلاقية
- الإكراه والتحويل بين الأنواع