[TOC]
直接看官网的解释:
Sets the environment to be used by the given function. f can be a Lua function or a number that specifies the function at that stack level: Level 1 is the function calling setfenv. setfenv returns the given function.
说明一下stack level的意思,Level 1是调用setfenv的函数,Level 2是调用setfenv函数再上一层的调用函数,依此类推。
local env1 = { -- print = print, } function testSetfenv( ) setfenv(1, env1) -- print("testSetfenv") -- Error: testSetFenv函数所在的环境设置为env1,但是env1是没有print函数的 end testSetfenv()
把testSetfenv函数的环境设置为env1,所以全局_G的函数print是不存在的,会报错。
可以使用setfenv构建类似model的功能,^_^!
模块文件testSetfenv.lua
-- 一个函数 function test() print("Test setfenv.") end -- 一个变量 testvar = 666 -- print是_G的函数,在新环境中不存在 -- print("test ... ")
构建代码:
local MyModel={} local func = loadfile("testSetfenv.lua") local fenv = setfenv(func, MyModel) fenv() --MyModel就是新的模块啦 print("test = ", MyModel.test) print("var = ", MyModel.testvar) -- MyModel.test()
小结:
可以看到结果:
test = function: 0087D200 var = 666