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 = x self.y = y self.w = w self.h = h print("init------------", x, y, w, h)end
2,testenv.lua
local func = loadfile("rect.lua")--加载源文件,并以函数的形式返回local env = {}setmetatable(env, {__index = _G})--继承全局环境,如果不继承则setfenv后无法使用LUA API,如print等if type(func) == "function" then setfenv(func, env) func() --在环境env中执行源文件,执行后env中就有了Rect类end--生成一个新环境的好处是:执行时是在新环境(即新表)中执行的,--生成数据和操作数据都是对新环境(新表)的操作,不会影响全局环境_Glocal Rect = env.RectRect:Init(1,2,3,4)--也可以这样调用,类似_G["a"]的用法env["Rect"]:Init(3,5,3,5)--注意type(k) == "string"for k, v in pairs(env) doprint(k, type(k)) -- Rect stringend