zoukankan      html  css  js  c++  java
  • Lua只读表

    利用Lua的元表(metatable)和元函数(metafunction)可以很简单的实现此功能。


    其实现大致分为三个部分

    • 1.禁止在表中创建新值
    • 2.禁止改变已有的值
    • 3.将子表也变为只读

    1.禁止在表中创建新值

    使用__newindex元函数即可,它的作用就是在表赋新值时调用

    local static = {
        exist={exist={exist=true}},
    }
    setmetatable(static, {__newindex = function() assert(false, 'table is readonly
    ') end})
    static['not-exist'] = false

    这样给只读表赋一个新值,就会报错了

    2.禁止改变已有的值

    这一项功能没有元函数直接提供,可以通过另一个方法巧妙的实现

    原理:将传入的表作为返回表的元表__index,这样如果你想要改变值,就会转化为赋新值,这样就会调用元表的__newindex

    local readonly = function(t)
        local meta = {
            __index    = t,
            __newindex = function() assert(false, 'table is readonly
    ') end,
        }
        local locked = {}
        setmetatable(locked, meta)
        return locked
    end
    
    
    local static = {
        exist={exist={exist=true}},
    }
    static = readonly(static)
    static['exist'] = false

      

    3.将子表也变为只读

    此功能使用递归很好实现,只要对子表递归调用readonly函数即可。

    local static = {
        exist={exist={exist=true}},
    }
    
    local readonly
    readonly = function(t, deep)
        if deep then
            for k,v in pairs(t) do
                if type(v) == 'table' then
                    t[k] = readonly(v, deep)
                end
            end
        end
    
        local meta = {
            __index    = t,
            __newindex = function() assert(false, 'table is readonly
    ') end,
        }
        local locked = {}
        setmetatable(locked, meta)
        return locked
    end
    
    static = readonly(static, true)
    static['exist']['exist']['exist'] = false

    -- 打印表结构,如下图
    print(inspect(static))

    至此,readonly表就大成了,虽然其改变了表结果不过表用起来没什么变化

    当前,它也存在问题,就是打印表不方便,很不直观,对调试可能会存在影响。

    下面是使用inspect打印的表,看这样的表找字段数据,会有股蛋蛋的忧伤。。。

  • 相关阅读:
    微信小程序授权获取用户详细信息openid
    微信开发之微信网页授权 完整示例
    linux 安装MySql 5.7.20 操作步骤【亲测】
    CentOS7下rabbitmq的详细安装教程
    Makefile:248: /usr/local/otp_src_18.1/make/x86_64-unknown-linux-gnu/otp_ded.mk: No such file
    Calendar的add()方法介绍
    怎样梳理属于自己的项目管理套路?
    项目经理必备9大获得领导支持秘技
    为什么绝大多数项目经理在不断救火?
    Java IO流学习总结
  • 原文地址:https://www.cnblogs.com/luweimy/p/4450276.html
Copyright © 2011-2022 走看看