Lua Academy · Pelajaran

Model _ENV dalam Lua 5.2+

Fahami cara _ENV menggantikan setfenv dan membolehkan kawalan persekitaran.

Pelajaran 1 daripada 413 langkah

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.0

Membaca _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 = nil

Mengesan 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.

Percuma untuk bermula

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

  1. Model _ENV dalam Lua 5.2+
  2. Membina Kotak Pasir Terhad
  3. Mencegah Pelarian Kotak Pasir
  4. Had Sumber dan Instrumentasi
← Kembali ke Lua Academy