为lua table写保护变成只读
2015-11-26 22:11
447 查看
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字段区域的值。
相关文章推荐
- WAX 介绍
- freeswitch会议模块lua脚本
- 小巧灵活语言LUA小开篇
- Sublime Text 2使用:如何为它添加编译环境(如Lua编译环境)和代码片段
- LuaBasicScripts
- Lua学习笔记(1) : 第一个Lua程序 - Lua与C++混合编程
- lua的metatable讲解
- Lua:访问模块、创建模块、子模块与包
- protoc-gen-lua支持嵌套类型
- Lua:table对象、类、继承、多重继承
- 【LeetCode】150 Evaluate Reverse Polish Notation 小侃小解
- Operating System: Three Easy Pieces --- Evaluating Spin Locks (Note)
- Lua查找表元素过程(元表、__index方法是如何工作的)
- lua 类, 继承, 面向对象再次理解
- lua--协程
- lua高级
- lua学习03——table
- lua--lua中的迭代器
- Lua5.1中的API函数
- lua string介绍