前言
今天来这个函数是用来查询当前运行环境的,也就是运行这个函数时的环境是怎样的,包含了哪些函数和变量,当然不同的函数有不同的环境,不同的调用层级也由于不同的环境,但是这个函数在使用上我有一点迷惑,正好写出来大家帮我看一下。
内容
getfenv
- 原型:getfenv([f])
- 解释:返回参数
f
所指定函数使用的当前环境,参数f
可以是一个Lua函数也可以是一个指定函数调用层级的数字,当参数为1时,表示正在调用函数getfenv()
函数的函数。如果被指定的函数不是Lua函数,或者是一个数字0,则函数getfenv()
返回全局环境,这个数字默认为1。
usage
- 首先我们新建一个文件将文件命名为getfenvtest.lua然后编写代码如下:
-- 定义一个函数
function print_message(str)
print("Lua output : "..str)
end
local ret = getfenv(print_message)
print("print_message env is", ret)
if ret.print_message then
print("print_message function is exist!")
end
local function test_level(level)
print("\nthis is function to test level")
_G["test_getfenv"] = true;
return getfenv(level)
end
function show_level(level)
local ret = test_level(level)
return ret
end
print("\nbegin _G[\"test_getfenv\"] =", _G.test_getfenv)
-- 测试level参数第一组
local ret1 = show_level(1)
print("level = 1 , _G[\"test_getfenv\"] =", ret1.test_getfenv)
-- 测试level参数第二组
local ret2 = show_level(2)
print("level = 2 , _G[\"test_getfenv\"] =", ret2.test_getfenv)
-- 测试level参数第三组
local ret3 = show_level(3)
print("level = 3 , _G[\"test_getfenv\"] =", ret3.test_getfenv)
- 运行结果
总结
- 最开始的测试中
getfenv(print_message)
我们在打印结果时发现,函数print_message
的环境中有了"print_message"
这个值。 - 后面的三组测试我原本是想测试不同层级的堆栈所处的环境是不同的,我在第2层函数里加入了
_G["test_getfenv"] = true;
结果发现每一层堆栈的环境中都有这个值。 - 不知道我是不是理解错了,希望知道原因的小伙伴能告诉我一声,当这个参数为不同数字时究竟有什么不同,谢谢。
追加附注
最近偶然间搞清楚了这个getfenv()
函数为什么在函数不同的层级不起作用了,也就是总结中提问的问题,原因就是函数getfenv()
函数生效的前提是先调用setfenv()
函数设置环境,否则不同函数层级的环境都是全局环境_G
,具体参见Lua base setfenv(),在这一篇文章中你会找到答案。
2016-11-26 17:08:59 星期六