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

相关推荐
lsx20240612 分钟前
Bootstrap5 输入框组
开发语言
lsx20240621 分钟前
C++ 动态内存管理
开发语言
浩瀚地学24 分钟前
【Java】数组
java·开发语言
陈鋆28 分钟前
Langchain-Chatchat[四、RAG对话流程代码解析]
开发语言·python·langchain
β添砖java40 分钟前
python第一阶段第九章异常、模块、包
开发语言·python
2501_9419820542 分钟前
企业微信Python SDK:高效群发消息实战
开发语言·python·企业微信
yue00842 分钟前
C# Environment类的介绍
开发语言·c#·environment
即将进化成人机1 小时前
Spring Boot配置文件
java·开发语言·intellij-idea
龙智DevSecOps解决方案1 小时前
Java开发基础:什么是Spring Boot?一文了解其优势、对比以及如何通过Perforce JRebel实现高效开发
java·开发语言·spring boot·jrebel·perforce·java开发
PPPPickup1 小时前
easychat---创建,获取,获取详细,退群,解散,添加与移除群组
java·开发语言·后端·maven