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也会相应改变和定位。

相关推荐
人才程序员几秒前
详解Qt 中使用虚拟键盘(软键盘qtvirtualkeyboard)
开发语言·数据库·c++·qt·计算机外设·界面·c语音
喵呜角角2 分钟前
QML TableView 实例演示 + 可能遇到的一些问题(Qt_6_5_3)
开发语言·windows·qt·qml·qt quick
撸码到无法自拔2 分钟前
R语言贝叶斯分析:INLA 、MCMC混合模型、生存分析肿瘤临床试验、间歇泉喷发时间数据应用|附数据代码...
开发语言·r语言
SSONICX3 分钟前
QT:生成二维码 QRCode
开发语言·qt
老汉忒cpp6 分钟前
Qt-系统相关(1)事件&文件
开发语言·qt
小宋102126 分钟前
实现java执行kettle并传参数
java·开发语言·etl
FreeLikeTheWind.39 分钟前
C语言实例之9斐波那契数列实现
c语言·开发语言·算法
爱编程— 的小李1 小时前
文件的处理(c语言)
c语言·开发语言
monkey_meng1 小时前
【Rust Iterator 之 fold,map,filter,for_each】
开发语言·后端·rust
Vae_Mars1 小时前
QT-protected
开发语言·qt