关于lua解决随意创建全局变量问题

local _g = _G 
    exports = {}
    setmetatable(exports,{
        __newindex = function(_, key, value)
            rawset(_g, key, value)
        end,

        __index = function(_, key)
            return rawget(__g, key)
        end
    })
    
    setmetatable(__g, {
        __newindex = function(_, name, value)
            print("error", 0)
        end
    })

    -- 赋值方式
    exports.x = 18
    print(x) -- 取值方式,打印结果为18
  • 元表
    在给表a赋值, a[key] = value, 会调用__newindex方法。
    查询表a时候, 通过 a[key] 获取value,则调用 __index方法。
    通过重写以上两个方法改变G表 查询及赋值 方式, 从而改变全局变量的赋值方式,改用exports作为新表获取值。
  • rawset
    rawset 是忽略元表的赋值方式(__newindex),采用简单的直接赋值, rawset(table, key, value)相当于 table[key] = value
  • rawget
    同理,忽略元表的取值,直接返回value
  • 以上赋值使用方式
    在全局中,随便一个地方,采取exports.key = value,即可赋值
posted @   滑华  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示