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 = 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
--生成一个新环境的好处是:执行时是在新环境(即新表)中执行的,
--生成数据和操作数据都是对新环境(新表)的操作,不会影响全局环境_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