lua只读表

参考《programming in lua》13.4.5中,详细介绍了只读表的用法。建立一个函数,传入一个table,传出一个代理table,其__index指向传入的table,__newIndex直接报error即可:

Lua 复制代码
--输入一个table,输出一个代理table,其只读
function table.readOnly(tbTarget)
    local proxy = {}
    setmetatable(proxy,{
        __index = tbTarget,
        __newindex = function(t,k,v)
            error("attempt to update a read-only table", 2)
        end
    })
    return proxy
end

A = {}
A[1] = 1

B = table.readOnly(A)
print(B[1]) --print:1
B[2] = 2 --print:attempt to update a read-only table
B[1] = "a" --print:attempt to update a read-only table

A[1] = 2
print(B[1]) --print:2
A[2] = 3
print(B[2]) --print:3

其中有两个重要的点:

1.index重新定位至原table,但proxy本身是空表,newIndex无论是什么key都会报error,不管原table内部是否有这个key。

2.__index实际是地址形式,如若中途修改了原table内部的值,proxy代理table也会相应改变和定位。

相关推荐
资生算法程序员_畅想家_剑魔几秒前
Java常见技术分享-26-事务安全-锁机制-作用与分类
java·开发语言·数据库
qq_4061761417 分钟前
JS 事件循环(Event Loop)
开发语言·前端·javascript
weixin_4331793331 分钟前
python - for循环,字符串,元组基础
开发语言·python
智航GIS1 小时前
9.1 多线程入门
java·开发语言·python
qq19257230271 小时前
QT的QML
开发语言·qt
情缘晓梦.1 小时前
C语言分支与循环
c语言·开发语言
消失的旧时光-19431 小时前
从 Java 接口到 Dart freezed:一文彻底理解 Dart 的数据模型设计
java·开发语言·flutter·dart
大头流矢2 小时前
C++的类与对象·三部曲:初阶
开发语言·c++
weixin_433179332 小时前
Python - word jumble游戏
开发语言·python
AAA.建材批发刘哥2 小时前
03--C++ 类和对象中篇
linux·c语言·开发语言·c++·经验分享