我正在尝试控制交互式环境。这是我的尝试:
home: lua
Lua 5.0.3 Copyright (C) 1994-2006 Tecgraf, PUC-Rio
> for n in pairs(_G) do io.write(n) end
stringxpcallLUA_PATHtostringgcinfoloadlibosunpackrequiregetfenvsetmetatablenext_TRACEBACKasserttonumberiorawequalcollectgarbagegetmetatable_LOADEDrawsetmathLUA_CPATHpcalldebug__powtypetablecoroutineprint_Gnewproxyrawgetloadstring_VERSIONdofilesetfenvpairsipairserrorloadfile>
> G=_G
> _G={}
> setmetatable(_G,{__index=G,__newindex=function() print("nope") end})
> for n in pairs(_G) do io.write(n) end
> x=3
>
我希望看到" nope"在命令" x = 3"之后。然而,它经历了。是不是_G为空,_G的任何访问/更新都将通过定义的元方法?
答案 0 :(得分:2)
来自Lua 5.0手册:
<强> _G 强>
保存全局环境的全局变量(不是函数)(即
_G._G = _G
)。 Lua本身并没有使用它 变量;改变其价值不会影响任何环境。 (使用setfenv
改变环境。)
更具体地说,在交互式Lua解释器中,您需要setfenv( 0, new_global_env )
将当前运行的线程的环境更改为new_global_env
。
示例:
Lua 5.0.3 Copyright (C) 1994-2006 Tecgraf, PUC-Rio
> do
>> local rawget, print, _G = rawget, print, _G
>> local new_global_env = setmetatable( { tostring = tostring }, {
>> __index = function( t, k )
>> print( "get", k )
>> return rawget( _G, k )
>> end
>> } )
>> setfenv( 0, new_global_env )
>> end
> print( "hello" )
get print
hello
>
(rawget
,print
和_G
的上限以及新的tostring
全局是避免无限递归所必需的。)