Lua _G

作者: Lennie_S | 来源:发表于2019-07-01 19:33 被阅读0次

1.以一个模块(*.lua,后同)为单位,所有的全局变量都保存在table中,这个table放在_G中,这是一个全局空间(全局环境变量),可以简单的看作一个表。

2._G中只保存全局变量,不保存局部变量。

3.lua中真正存储全局变量的地方不是在_G里面,而是在setfenv(i,table)的table中,所有当前的全局变量都在这里面找,只不过在程序开始时lua会默认先设置一个变量_G=这个里面的table而已。所以在新设置环境后,如果还想找到之前的全局变量,通常需要附加上为新的table设置元表{_index=_G}。setfenv的第一个参数可以是当前的堆栈层次,如1代表当前代码块,2表调用当前的上一层,也可以是具体的那个函数名,表示在那个函数里。

4.全局环境变量_G一个很重要的应用是lua服务器的热更新

看下几个例子:

a=1

print(a)

print(_G.a)

--正常情况,输出1,1

a=1

setfenv(1,{})

print(a)

print(_G.a)

--这时会出错说找不到print,因为当前的全局变量表示空的,啥也找不到的

local mt={__index=_G}

local t={}

setmetatable(t,mt)

setfenv(1,t)

print(a)

print(_G.a)

--这是正确输出,因为新的全局表采用之前的表做找不到时的索引,原先的表里面存在print 、_G、 a这些东西

local b = 3

local newg = {}

setmetatable(newg, {__index = _G})--绑定到newg新的table 空间中

setfenv(1, newg)--改变环境,设定到newg

a = 10

print(a) ---》10

print(_G.a) _G,还是原来的空间 --》1

print(_G.b) --->nil,因为所有全局变量才会存到_G空间,去取b的话,_G里面会找不到这个定义,结果为nil

print(b) --->3,因为所有全局变量才会存到_G空间,这个时候也就是local是定义到了newg空间里面

function factory()

        return function()

          return a

end

end

a = 4

f1 = factory()

f2 = factory()

print(f1())

print(f2())

setfenv(f1, {a = 5}) --这里设置函数为环境的时候,f1中的return a是受到table {a = 5}的影响(由于setfenv的第一个参数为f1),

print(f1())--->5

print(f2())--4

热更新相关文章看上一篇文章   

http://blog.csdn.net/peter_teng/article/details/52751231

转自:https://blog.csdn.net/peter_teng/article/details/52751243

另一篇介绍文章: https://blog.csdn.net/u012336081/article/details/51131811

相关文章

  • Lua API (get functions Lua->stac

    1: void lua_gettable(lua_State* L, int idx) 2: void lua_g...

  • Lua _G

    1.以一个模块(*.lua,后同)为单位,所有的全局变量都保存在table中,这个table放在_G中,这是一个全...

  • Lua base _G

    前言 今天来看一个Lua中的一个非常重要的全局变量_G,这个变量可以说是Lua中最重要的一个变量了,其中保存了lu...

  • SLua踩坑指南:expect self, but get nu

    报错Lua脚本如下: import "UnityEngine"local aa = FinderFactory:G...

  • Lua源码模块分析

    这些模块实现实用功能: ldebug.c - 调试接口。包括访问调试挂钩的函数(lua_sethook,lua_g...

  • 2019-01-10

    cocos2dx-lua工程捕获lua错误并弹出错误提示 找到__G__TRACKBACK__方法的定义,一般在m...

  • Lua的OOP小例子

    player.lua magician.lua soldier.lua main.lua

  • Lua: Error during loading: [stri

    root账户打开/usr/share/wireshark/init.lua shift+g到最后一行 倒数第二行d...

  • lua开篇-hello lua

    1、获取lua 访问lua官网:http://www.lua.org/ 下载最新的lua版本lua-5.3.4.t...

  • Lua的_G表里有啥?

    今天看xlua源码的时候发现了一个表 _G,如图所示: 那它到底啥呢?应该是保存了lua所有用到的全局变量和局部变...

网友评论

    本文标题:Lua _G

    本文链接:https://www.haomeiwen.com/subject/axincctx.html