0Pricing
Lua Academy · Ders

Lua 5.2+'da _ENV Modeli

_ENV'nin setfenv'in yerini nasıl aldığını ve ortam denetimini nasıl sağladığını anlayın.

Lua 5.2+'da _ENV Modeli, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.

_ENV Nedir?

Lua 5.2 ve sonraki sürümlerde her parçanın _ENV adlı örtük bir üst değeri vardır. Tüm genel değişken erişimleri, _ENV üzerindeki alan erişimleri olarak yeniden yazılır. Böylece print(x), _ENV.print(_ENV.x) biçimine dönüşür.

_ENV, setfenv'in Yerini Alır

Lua 5.1'de setfenv(fn, env), bir işlevin genel ortamını değiştirirdi. 5.2 ve sonraki sürümlerde bu işlev kaldırılmıştır. Bunun yerine bir parçanın veya bloğun ortamını değiştirmek için _ENV değerini yerel olarak ayarlayın.

Bir Parçada _ENV'yi Değiştirme

Tüm genel erişimleri yeniden yönlendirmek için bir parçanın başında _ENV'yi ayarlayın.

-- Everything in this chunk uses myEnv as globals
local _ENV = myEnv
print("hello")  -- calls myEnv.print("hello")

Bir Blok İçin Yerel _ENV

Etki alanını sınırlamak için _ENV değişikliklerini bir do...end bloğuyla kapsamlandırın.

do
  local _ENV = {print = print, x = 42}
  print(x)  -- 42 from local _ENV
end
print(x)  -- original _ENV.x (global x)

_ENV ile load Kullanımı

load(chunk, chunkname, mode, env), bir dizeyi özel bir ortamla parça olarak çalıştırır. Bu, 5.2 ve sonraki sürümlerde temel korumalı alan mekanizmasıdır.

local env = {print = print, math = math}
local fn, err = load("print(math.sqrt(16))", "sandbox", "t", env)
if fn then fn() end  -- 4.0

Geçerli _ENV'yi Okuma

Geçerli parçanın genel değişkenleri _ENV içindedir. Bir başvuru almak için: local myEnv = _ENV.

_ENV'yi Çalışma Zamanında Değiştirme

Genel bir değişken ayarlamak için _ENV.varName = value kullanılır. _ENV bir üst değer olduğundan, kodun herhangi bir noktasında onu farklı bir tabloyla değiştirebilirsiniz.

__index ile Kalıtım

Korumalı alan ortamına __index = _G içeren bir meta tablo vererek, açıkça engellemediğiniz işlevler için gerçek genel tabloya geri dönüş sağlayın.

local sandboxEnv = setmetatable({}, {__index = _G})
-- then block dangerous ones:
sandboxEnv.os = nil
sandboxEnv.io = nil
sandboxEnv.load = nil

_ENV Erişim Girişimlerini Algılama

Güvenlik denetimi için erişim girişimlerini günlüğe kaydeden bir belirteçle tehlikeli genel değişkenleri değiştirin.

sandboxEnv.os = setmetatable({}, {
  __index = function(_, k)
    ngx.log(ngx.WARN, "Blocked access: os." .. k)
    return nil
  end
})

Uyumluluk Notu

Lua 5.1'in setfenv/getfenv işlevlerini kullanan kitaplıkların 5.2 ve sonraki sürümler için yeniden yazılması gerekir. Bazıları başlatma kodunda bir uyumluluk katmanı kullanır.

Pratik Etki

_ENV modeli, korumalı alan oluşturmayı daha temiz ve tutarlı hâle getirir. Ortamlar için iki farklı mekanizma yerine tek ve açık bir mekanizma vardır (işlevler için setfenv, üst düzey için genel değişkenler).

_ENV Sorusu

Lua 5.2 ve sonraki sürümler, print(x) genel erişimini nasıl yeniden yazar?

Özet: _ENV Modeli

Lua 5.2 ve sonraki sürümler, tüm genel erişimleri _ENV üst değeri üzerinden gerçekleştirir. Kodu özel bir ortamda çalıştırmak için load(code, name, "t", env) kullanın. Bu, setfenv işlevinin yerini alan standart korumalı alan mekanizmasıdır.

Sıkça Sorulan Sorular

“Lua 5.2+'da _ENV Modeli” dersi ücretsiz mi?

Evet — “Lua 5.2+'da _ENV Modeli” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.

“Lua 5.2+'da _ENV Modeli” dersinde ne öğreneceğim?

_ENV'nin setfenv'in yerini nasıl aldığını ve ortam denetimini nasıl sağladığını anlayın. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Lua Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Lua 5.2+'da _ENV Modeli” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Lua 5.2+'da _ENV Modeli
  2. Kısıtlı Bir Korumalı Alan Oluşturma
  3. Korumalı Alan Kaçışlarını Önleme
  4. Kaynak Sınırları ve Enstrümantasyon
← Lua Academy Sayfasına Dön