LUA 环境
LUA 環(huán)境
LUA中環(huán)境是指一個(gè)函數(shù)執(zhí)行的表,即一個(gè)函數(shù)在什么表中執(zhí)行。
這里的函數(shù)是特殊的,是loadfile("x.lua")的返回值。
loadfile("x.lua")從x.lua文件加載源碼,形成一個(gè)源碼塊,但沒有執(zhí)行。只有手動(dòng)去執(zhí)行它才會(huì)真正運(yùn)行其中代碼,如下:
local func = loadfile("x.lua")
func() --執(zhí)行該源碼,開始逐行運(yùn)行x.lua中的代碼,如 require, 函數(shù)外的print等。
如何設(shè)置環(huán)境呢,如下:
local env = {}
setfenv(func, env)
這樣就設(shè)置了x.lua的執(zhí)行環(huán)境為表env。這有二層意思:
1,執(zhí)行func()后,env中就有了x.lua中所有的東西。
2,x.lua的視野被限制在了env中。env中沒有的東西都不可用
示例如下:
1,rect.lua
Rect = {}Rect.Init = function(self, x,y,w,h)self.x = xself.y = yself.w = wself.h = hprint("init------------", x, y, w, h) end2,testenv.lua
local func = loadfile("rect.lua")--加載源文件,并以函數(shù)的形式返回local env = {} setmetatable(env, {__index = _G})--繼承全局環(huán)境,如果不繼承則setfenv后無法使用LUA API,如print等if type(func) == "function" thensetfenv(func, env)func() --在環(huán)境env中執(zhí)行源文件,執(zhí)行后env中就有了Rect類end--生成一個(gè)新環(huán)境的好處是:執(zhí)行時(shí)是在新環(huán)境(即新表)中執(zhí)行的, --生成數(shù)據(jù)和操作數(shù)據(jù)都是對(duì)新環(huán)境(新表)的操作,不會(huì)影響全局環(huán)境_G local Rect = env.Rect Rect:Init(1,2,3,4)--也可以這樣調(diào)用,類似_G["a"]的用法 env["Rect"]:Init(3,5,3,5)--注意type(k) == "string" for k, v in pairs(env) do print(k, type(k)) -- Rect string end?
posted on 2017-09-12 17:39 時(shí)空觀察者9號(hào) 閱讀(...) 評(píng)論(...) 編輯 收藏
總結(jié)
- 上一篇: 【转】iphone - ios app
- 下一篇: 【转】关于 Lua 内存泄漏的检测