lua env

每个被编译的Lua代码块都会有一个外部的局部变量叫做_ENV,因此,_ENV这个名字永远都不会成为一个代码块中的自由名字。在转译自由名字时,_ENV是否是那个外部的局部变量无所谓。_ENV和其他变量名没有区别。你可以定义一个新变量或指定一个参数叫做此名字。当编译器在转译自由名字时所用到的_ENV,指的是你的程序在那个点上可见的名为_ENV的变量。另外,被_ENV用于值的那张表被称为环境。

Lua环境由所有可操作的数据构成,如编译好的函数、变量、运行时内存。这些数据保存在一个称为lua_State的结构中。所有Lua应用程序都必要求至少有一个lua_State,如果需要还可以有多个,如需要为不同的系统保存不同的数据时。

对开发者来说,Lua环境是用来发送和接收数据的地方,它利用栈(Lua Stack)来达到该目的。Lua栈不同于系统栈,它只能通过Lua的API函数访问。

Lua在运行时创建变量并将其保存在环境中,Lua语言支持很多类型,重点用在C++代码中有三个:字符串、数字、函数。表和用户数据这样复杂的数据结构,最好还是只在Lua代码中使用。

Lua保有一个被称为全局环境的特别环境,它被保存在C 注册表的一个特别的索引下。在Lua中,全局变量_G被初始化为这个值(_G不被内部任何地方使用)。Lua将所有全局变量_G都保存在一个“环境(environment)”的表中,其优点在于:

  • 无需再为全局变量创建新的数据结构,简化了内部实现。
  • 直接使用表的方式来操作环境

当Lua加载一个代码块,_ENV上值的默认值就是全局环境。默认情况下,Lua代码中提及的自由名字都指的是全局环境中的相关项目(全局变量)。此外,所有标准库都被加载到全局环境,一些函数也针对这个环境做操作。可使用loadloadfile加载代码块,并赋予它们不同的环境。

for k,v in pairs(_G) do
    print(k, v)
end

rawget  function: 0000000061d18bd0
loadfile    function: 0000000061d19440
rawset  function: 0000000061d18b70
dofile  function: 0000000061d19510
type    function: 0000000061d18780
getmetatable    function: 0000000061d194b0
math    table: 0000000000d79730
_VERSION    Lua 5.3
tostring    function: 0000000061d18860
pcall   function: 0000000061d187e0
setmetatable    function: 0000000061d19110
rawlen  function: 0000000061d18c20
xpcall  function: 0000000061d186e0
debug   table: 0000000000d798f0
coroutine   table: 0000000000d790f0
collectgarbage  function: 0000000061d19040
tonumber    function: 0000000061d18930
assert  function: 0000000061d19590
error   function: 0000000061d18fb0
pairs   function: 0000000061d19280
arg table: 0000000000d79770
next    function: 0000000061d18e30
bit32   table: 0000000000d799f0
utf8    table: 0000000000d794b0
string  table: 0000000000d79970
print   function: 0000000061d18cd0
os  table: 0000000000d79430
io  table: 0000000000d797f0
table   table: 0000000000d790a0
require function: 0000000000d78ea0
load    function: 0000000061d19340
_G  table: 0000000000d76e00
package table: 0000000000d78ef0
select  function: 0000000061d18890
rawequal    function: 0000000061d18c80
ipairs  function: 0000000061d192a0
-- for k,v in pairs(_G) do
--     print(k, v)
-- end

function getGlobal(key)
    local g = _G
    for k in string.gmatch(key, "[%w_]+") do
        g = g[key]
    end
    return g
end
function setGlobal(key, val)
    local g = _G
    for k,v in string.gmatch(key, "([%w_]+)(%.?)") do
        if v=="." then
            g[k] = g[k] or {}
            g = g[k]
        else
            g[k] = val
        end
    end
end

-- print(getGlobal("error"))
-- print(_G["error"])

-- setGlobal("pi", 3.14)
-- print(getGlobal("pi"))

local global = {}
local mt = {}
mt.__index = function(_, key)
    if not global[key] then
        error("错误:试图访问未定义的变量"..key)
    else
        return rawget(_, key)
    end
end
mt.__newindex = function(table, key, val)
    if not global[key] then
        local what = debug.getinfo(2, "S").what
        print(what)
        if what~="main" and what~="C" then
            print(what)
            error("错误:试图写入未定义的变量"..key)
        end
        global[key] = true
    end
    print("日志:设置全局变量"..key.."为"..val)
    rawset(table, key, val)
end
setmetatable(_G, mt)

i = 100
function test()
    l = 100
end

具有动态名字的全局变量

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,733评论 0 38
  • 第一篇 语言 第0章 序言 Lua仅让你用少量的代码解决关键问题。 Lua所提供的机制是C不擅长的:高级语言,动态...
    testfor阅读 2,649评论 1 7
  • 名称 说明 docLua 相关的文档,包括了编译文档、接口文档等 Makefile 编译Lua使用,在...
    一川烟草i蓑衣阅读 1,418评论 0 1
  • 1. 写在前面 很多时候我们都需要借助一些脚本语言来为我们实现一些动态的配置,那么就会涉及到如何让脚本语言跟原生语...
    杰嗒嗒的阿杰阅读 3,423评论 9 31
  • 这道题目做了一天算是,出错的原因是,首先找最小路径要考虑他有负数,所以剪枝不行然后改掉错误以后就超时了,代码如下:...
    April63阅读 194评论 0 0