نموذج _ENV في Lua 5.2 وما بعده
افهم كيف حلّ _ENV محل setfenv وأتاح التحكم في البيئة
نموذج _ENV في Lua 5.2 وما بعده درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
ما هو _ENV؟
في Lua 5.2 والإصدارات الأحدث، تحتوي كل وحدة برمجية على upvalue ضمني يُسمى _ENV. وتُعاد كتابة جميع عمليات الوصول إلى المتغيرات العامة لتصبح عمليات وصول إلى حقول في _ENV. لذلك تتحول print(x) إلى _ENV.print(_ENV.x).
يستبدل _ENV setfenv
في Lua 5.1، تغيّر setfenv(fn, env) البيئة العامة لدالة. أما في الإصدار 5.2 والإصدارات الأحدث فقد أُزيلت هذه الدالة. وبدلًا من ذلك، عيّن _ENV كمتغير محلي لتغيير بيئة وحدة برمجية أو كتلة.
تغيير _ENV في وحدة برمجية
عيّن _ENV في أعلى الوحدة البرمجية لإعادة توجيه جميع عمليات الوصول إلى المتغيرات العامة.
-- Everything in this chunk uses myEnv as globals
local _ENV = myEnv
print("hello") -- calls myEnv.print("hello")_ENV محلي لكتلة
اجعل تغييرات _ENV مقتصرة على كتلة do...end للحد من نطاق تأثيرها.
do
local _ENV = {print = print, x = 42}
print(x) -- 42 from local _ENV
end
print(x) -- original _ENV.x (global x)استخدام load مع _ENV
تنفّذ load(chunk, chunkname, mode, env) سلسلة نصية بوصفها وحدة برمجية باستخدام بيئة مخصصة. وهذه هي الآلية الأساسية للعزل في الإصدار 5.2 والإصدارات الأحدث.
local env = {print = print, math = math}
local fn, err = load("print(math.sqrt(16))", "sandbox", "t", env)
if fn then fn() end -- 4.0قراءة _ENV الحالي
المتغيرات العامة في الوحدة البرمجية الحالية موجودة في _ENV. وللحصول على مرجع إليها: local myEnv = _ENV.
تعديل _ENV أثناء التشغيل
يكون تعيين متغير عام على النحو _ENV.varName = value. وبما أن _ENV هو upvalue، يمكنك استبداله بجدول مختلف في أي موضع من الشيفرة.
الوراثة باستخدام __index
امنح بيئة العزل metatable مع __index = _G للرجوع إلى الجدول العام الحقيقي عند طلب دوال لم تحظرها صراحةً.
local sandboxEnv = setmetatable({}, {__index = _G})
-- then block dangerous ones:
sandboxEnv.os = nil
sandboxEnv.io = nil
sandboxEnv.load = nilاكتشاف محاولات الوصول إلى _ENV
استبدل المتغيرات العامة الخطرة بقيمة sentinel تسجّل محاولات الوصول لأغراض التدقيق الأمني.
sandboxEnv.os = setmetatable({}, {
__index = function(_, k)
ngx.log(ngx.WARN, "Blocked access: os." .. k)
return nil
end
})ملاحظة حول التوافق
تحتاج المكتبات التي تستخدم setfenv/getfenv في Lua 5.1 إلى إعادة كتابتها لتعمل مع الإصدار 5.2 والإصدارات الأحدث. وتستخدم بعض المكتبات طبقة توافق في شيفرة التهيئة.
الأثر العملي
يجعل نموذج _ENV عملية العزل أكثر وضوحًا واتساقًا. فهو يوفر آلية واحدة واضحة للبيئات بدلًا من آليتين (setfenv للدوال والمتغيرات العامة للمستوى الأعلى).
سؤال حول _ENV
كيف تعيد Lua 5.2 والإصدارات الأحدث كتابة عملية الوصول العامة print(x)؟
مراجعة: نموذج _ENV
تجعل Lua 5.2 والإصدارات الأحدث جميع عمليات الوصول العامة تمر عبر upvalue المسمى _ENV. استخدم load(code, name, "t", env) لتنفيذ الشيفرة في بيئة مخصصة. وهذه هي آلية العزل القياسية التي تستبدل setfenv.
الأسئلة الشائعة
هل درس «نموذج _ENV في Lua 5.2 وما بعده» مجاني؟
نعم — نص درس «نموذج _ENV في Lua 5.2 وما بعده» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «نموذج _ENV في Lua 5.2 وما بعده»؟
افهم كيف حلّ _ENV محل setfenv وأتاح التحكم في البيئة تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «نموذج _ENV في Lua 5.2 وما بعده»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نموذج _ENV في Lua 5.2 وما بعده
- إنشاء بيئة معزولة مقيّدة
- منع الهروب من البيئة المعزولة
- حدود الموارد وأدوات القياس