为lua table写保护变成只读

local function readOnly(t)
    local newTable = {}
    local mt = {
       __index=t,
       __newindex=function(t, k, v)
              error("read only!");
         end
    }
    setmetatable(newTable, mt);
    return newTable
end

local tbl = readOnly({"A", "c"})
通过readOnly返回的表是无法进行赋值操作的。
</pre><pre name="code" class="plain">因为readOnly会创建一个新的空table,并把传进去的table 作为_index的元方法。
元表里还增加了一个_newindex,用来阻止不存在字段的赋值操作。
通过readOnly返回的表已经不是原来的tale了,只是一个空的table,但是它被设置了一个新的元表。
例如 tbl[1] = "B",对tbl的第一个元素进行赋值操作,实际上tbl是一个空的table 根本不存在 1 这个字段,所以会调用_newindex的元方法 去对table进行更新。由于重写了_newindex的元方法,所以会触发报错信息。
如果只是调用tbl,而不去对其进行赋值。例如print(tbl[1]),则能正常输出“A”,因为tbl元表里有_index元方法,虽然tbl中不存在 1 这个字段,但可以通过_index找到这个字段。
</pre><pre name="code" class="plain">注:rawget(table, key) 可以忽略元表的_index功能(就是不通过_index的元方法进行查找) 取出table中key字段的值
   rawest(table, key, value) 可以忽略元表的_newindex功能(就是不通过_newindex的元方法对表的不存在区域值进行更新)直接更新表key字段区域的值。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值