LUA 环境
LUA 環境
LUA中環境是指一個函數執行的表,即一個函數在什么表中執行。
這里的函數是特殊的,是loadfile("x.lua")的返回值。
loadfile("x.lua")從x.lua文件加載源碼,形成一個源碼塊,但沒有執行。只有手動去執行它才會真正運行其中代碼,如下:
local func = loadfile("x.lua")
func() --執行該源碼,開始逐行運行x.lua中的代碼,如 require, 函數外的print等。
如何設置環境呢,如下:
local env = {}
setfenv(func, env)
這樣就設置了x.lua的執行環境為表env。這有二層意思:
1,執行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")--加載源文件,并以函數的形式返回local env = {} setmetatable(env, {__index = _G})--繼承全局環境,如果不繼承則setfenv后無法使用LUA API,如print等if type(func) == "function" thensetfenv(func, env)func() --在環境env中執行源文件,執行后env中就有了Rect類end--生成一個新環境的好處是:執行時是在新環境(即新表)中執行的, --生成數據和操作數據都是對新環境(新表)的操作,不會影響全局環境_G local Rect = env.Rect Rect:Init(1,2,3,4)--也可以這樣調用,類似_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 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏
總結
- 上一篇: 【转】iphone - ios app
- 下一篇: 【转】关于 Lua 内存泄漏的检测