Model _ENV dalam Lua 5.2+
Fahami cara _ENV menggantikan setfenv dan membolehkan kawalan persekitaran.
Model _ENV dalam Lua 5.2+ ialah pelajaran Lua Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Lua Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.
Apakah _ENV?
Dalam Lua 5.2 ke atas, setiap unit kod mempunyai nilai luaran tersirat yang dipanggil _ENV. Semua capaian pemboleh ubah global ditulis semula sebagai capaian medan pada _ENV. Jadi print(x) menjadi _ENV.print(_ENV.x).
_ENV Menggantikan setfenv
Dalam Lua 5.1, setfenv(fn, env) menukar persekitaran global sesuatu fungsi. Dalam 5.2 ke atas, ciri ini tiada. Sebaliknya, tetapkan _ENV sebagai pemboleh ubah setempat untuk menukar persekitaran sesuatu unit kod atau blok.
Menukar _ENV dalam Unit Kod
Tetapkan _ENV pada permulaan unit kod untuk mengubah hala semua capaian global.
-- Everything in this chunk uses myEnv as globals
local _ENV = myEnv
print("hello") -- calls myEnv.print("hello")_ENV Setempat untuk Blok
Hadkan skop perubahan _ENV kepada blok do...end untuk mengehadkan kesannya.
do
local _ENV = {print = print, x = 42}
print(x) -- 42 from local _ENV
end
print(x) -- original _ENV.x (global x)Menggunakan load dengan _ENV
load(chunk, chunkname, mode, env) melaksanakan rentetan sebagai unit kod dengan persekitaran tersuai. Ini ialah mekanisme utama pengasingan kod dalam kotak pasir bagi versi 5.2 ke atas.
local env = {print = print, math = math}
local fn, err = load("print(math.sqrt(16))", "sandbox", "t", env)
if fn then fn() end -- 4.0Membaca _ENV Semasa
Pemboleh ubah global unit kod semasa ialah _ENV. Untuk mendapatkan rujukan: local myEnv = _ENV.
Mengubah Suai _ENV Semasa Pelaksanaan
Menetapkan pemboleh ubah global dilakukan dengan _ENV.varName = value. Oleh sebab _ENV ialah nilai luaran, anda boleh menukarnya kepada jadual lain pada bila-bila masa dalam kod.
Pewarisan dengan __index
Berikan persekitaran kotak pasir sebuah metatabel dengan __index = _G untuk beralih kepada jadual global sebenar bagi fungsi yang belum anda sekat secara jelas.
local sandboxEnv = setmetatable({}, {__index = _G})
-- then block dangerous ones:
sandboxEnv.os = nil
sandboxEnv.io = nil
sandboxEnv.load = nilMengesan Percubaan Capaian _ENV
Gantikan pemboleh ubah global yang berbahaya dengan nilai penanda yang merekodkan percubaan capaian untuk pengauditan keselamatan.
sandboxEnv.os = setmetatable({}, {
__index = function(_, k)
ngx.log(ngx.WARN, "Blocked access: os." .. k)
return nil
end
})Nota Keserasian
Pustaka yang menggunakan setfenv/getfenv Lua 5.1 perlu ditulis semula untuk 5.2 ke atas. Sesetengahnya menggunakan lapisan keserasian dalam kod permulaan.
Kesan Praktikal
Model _ENV menjadikan pengasingan kotak pasir lebih kemas dan konsisten. Terdapat satu mekanisme yang jelas untuk persekitaran, bukannya dua (setfenv untuk fungsi berbanding pemboleh ubah global untuk peringkat teratas).
Soalan _ENV
Bagaimanakah Lua 5.2 ke atas menulis semula capaian global print(x)?
Imbas Kembali: Model _ENV
Lua 5.2 ke atas menjadikan semua capaian global melalui nilai luaran _ENV. Gunakan load(code, name, "t", env) untuk melaksanakan kod dalam persekitaran tersuai. Ini ialah mekanisme pengasingan kotak pasir standard yang menggantikan setfenv.
Pelajari Lua dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 40
- Pelajaran
- 159
Soalan Lazim
Adakah pelajaran “Model _ENV dalam Lua 5.2+” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Lua Academy, termasuk “Model _ENV dalam Lua 5.2+”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Model _ENV dalam Lua 5.2+”?
Fahami cara _ENV menggantikan setfenv dan membolehkan kawalan persekitaran. Anda berlatih Lua Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Lua Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Lua Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Model _ENV dalam Lua 5.2+” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Lua Academy ini?
Ya. Setiap pelajaran Lua Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Model _ENV dalam Lua 5.2+
- Membina Kotak Pasir Terhad
- Mencegah Pelarian Kotak Pasir
- Had Sumber dan Instrumentasi