lua中设置只读table

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

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

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

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

代码如下:
 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!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JackieZheng

FreeMarker模板开发指南知识点梳理

freemarker是什么? 有什么用? 怎么用? (问得好,这些都是我想知道的问题) freemarker是什么?   FreeMarker 是一款 模板引擎...

26590
来自专栏琯琯博客

PHP 优化技巧

35450
来自专栏IMWeb前端团队

Node中没搞明白require和import,你会被坑的很惨

ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是Common...

33080
来自专栏Scott_Mr 个人专栏

初识 Runtime

345100
来自专栏Java 源码分析

CountDownLatch 源码分析

CountDownLatch 源码分析 1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限,并且代码阅读起来没有 IDE...

36460
来自专栏Golang语言社区

Golang语言社区--【基础知识】入门

Go语言入门 1. 简介 本文是关于Go编程语言的基础教程,主要面向有C/C++基础的读者。它并不是一个语言的完整指南,关于 Go的具体细节请参考 语言规范 ...

34950
来自专栏Java编程技术

基于rxjava的生产消费模型

最近在看springcloud的熔断机制的实现,发现底层使用的rxjava实现,就看了下rxjava的使用,发现rxjava使用可也便捷实现前面讲解的定时生产与...

10120
来自专栏程序员同行者

find命令中参数perm的用法

不要让懒惰占据你的大脑,不让要妥协拖跨你的人生。青春就是一张票,能不能赶上时代的快车,你的步伐掌握在你的脚下,good luck

12030
来自专栏测试驿栈

JMeter(十)-正则表达式关联

jmeter中,接口自动化的关键在于参数关联。比如需要登录的接口,如何调用登录口令?一个增删改查的闭环,如何将接口参数上下传递?下面就以实际的例子来仔细说一说

15420
来自专栏JackieZheng

并发和多线程-说说面试长提平时少用的volatile

最近的面试,我也经常会问到volatile相关的问题,比如volatile和sychronized的区别;volatile的使用场景;volatile的实现原理...

5820

扫码关注云+社区

领取腾讯云代金券