0Pricing
Lua Academy · درس

نموذج _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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. نموذج _ENV في Lua 5.2 وما بعده
  2. إنشاء بيئة معزولة مقيّدة
  3. منع الهروب من البيئة المعزولة
  4. حدود الموارد وأدوات القياس
← العودة إلى Lua Academy