Lua语法小贴士(十)全局变量

Lua里我们可以随时声明或调用全局变量。

例如

test = 1
print(test)

当我们访问一个不存在的全局变量的时候,会返回nil,例如:

print(tst)

虽然很方便,但是往往会因为拼写错误而导致一些不容易发现的BUG。

Lua可以使用_G来表示全局变量所在的表,这样我们就可以修改_G表的__index和__newindex两个元方法(参考Lua语法小贴士(五)元表与元方法)来限制全局变量的访问。

local declaredNames = {}
setmetatable(_G,{
__newindex = function(t,n,v)
    if not declaredNames[n] then
        local w = debug.getinfo(2,"S").what
        if w ~= "main" and w ~= "C" then
            error("attempt to write to undeclared variable "..n, 2)
        end
        declaredNames[n]= true
    end
    rawset(t,n,v)
end,
__index = function(_, n)
    if not declaredNames[n] then
        error("attempt to read undeclared variable"..n, 2)
    else
        return nil
    end
end,})

我们通过debug.getinfo(参考Lua语法小贴士(十一)debug库)获取了函数的类型,Lua表示是普通的lua函数,C表示是C函数,main是在主chunk里,也就是没有被function end包围的区域。

这样我们在主chunk里面声明全局变量就没有问题,例如:

testChunk = 23
print(testChunk)

但是下面这段在函数里面访问未声明的全局变量时,就会报错:

local function a()
    funcTest = 1
end

a()


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值