前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >lua中设置只读table

lua中设置只读table

作者头像
王亚昌
发布2018-08-03 15:53:53
2.8K0
发布2018-08-03 15:53:53
举报
文章被收录于专栏:王亚昌的专栏王亚昌的专栏

C++里有const用来定义常量,保护参数或函数意外地修改,提高程序的健壮性。在lua里虽然没有没有类似的关键字,我们可以用表来模拟实现其只读的功能,来保护我们的数据被意义地修改。

 lua 里有一个__index metamethod,当我们访问一个表不存在的域时,会触发lua解释器去查找__index metamethod: 如果不存在,返回结果nil,如果存在,则由__index metamethod返回结果。

__newindex metamethod 是用来对表进行更新,当你给一个表缺少的域赋值,解释器就会查找__newindex metamethod,如果存在则调用这个函数,而不进行赋值操作。另外有一个 raw metamethod可经绕过__newindex metamethod。

我只须重写:__index metamethod 和__newindex metamethod 便可达到让表只读的目的。

代码语言:javascript
复制
代码如下:
 function table_read_only(t)
       local temp= t or {} 
      local mt = {
       __index = function(t,k) return temp[k] end ;
       __newindex = function(t, k, v)
             error("attempt to update a read-only table!")
        end
      }
  setmetatable(temp, mt) 
  return temp
end

用法:

local t_a = {1,2,3}

local t_b = table_read_only( t_a) --t_b为只读

t_b[5] = 1 --对表进行更新,会报错:attempt to update a read-only table!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013年09月02日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档