lua探索--------------(setfenv、getfenv相关)
2016-04-07 20:49
501 查看
newfenv = {} setfenv(1,newfenv) print(1)------attempt to call global 'print'(a nil value)
———————猜想分割线—————————————-
这是因为setfenv(1,newfenv)调用之后当前环境就被切换到了newfenv里,newfenv是一个global空表,里面是没有print的
newfenv = {} setmetatable(newfenv,{__index = _G}) setfenv(1,newfenv) a = 2 print(a)----------2
空表newfenv继承了_G,所以这段代码等于废话(真诚的表情)
newfenv = {_G = _G} a = 2 setfenv(1,newfenv) _G.print(a)----------nil
这里a为nil,是因为环境被切换称newfenv了,里面没有a这个字段,如果在a的前面加上_G就可以访问了
newfenv = {_G = _G} setfenv(1,newfenv) a = 2 _G.print(a)----------2
上面两段代码的结果不一致,猜想应该是setfenv这个函数调用的那一刻起,环境就切换完毕了,并且a变成了_G.newfenv的字段,前面那段代码的a的环境是_G,后面那段代码a的环境是newfenv,神奇~~~
local a = function() end print(_G)-------table:00XXXXX print(getfenv(a))--------table:00XXXX
上面证明裸代码中的变量或者函数或者其他的东东默认是在_G环境中
相关文章推荐
- lua的Metatables和Metamethods
- lua脚本之lua语言简介以及lua的安装
- Lua学习笔记-习题9.3
- 云风的博文《Lua C API 的正确用法》读后总结
- evaluateScript--evaluatePopoverScript--区别
- Lua学习笔记-9.4章-非抢占式的多线程
- Lua学习笔记六——package
- LUA require 搜索路径指定方法
- ngx_lua访问数据库
- lua使用table.concat连接大量字符串
- lua探索--------------(_G相关)
- LuaSQLite3 搭建使用过程
- Lua学习教程之 可变參数数据打包与解包
- Programming in Lua
- 我和Lua并非一见钟情,我们期待着日久生情(相遇篇)
- Embedding LuaJIT in 30 minutes (or so)
- FFI Library (lua 调用 c)
- Lua求n的阶乘
- Lua协同程序
- 使用ngx_lua构建高并发应用(2)