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

相关推荐
крон28 分钟前
【Auto.js例程】华为备忘录导出到其他手机
开发语言·javascript·智能手机
zh_xuan1 小时前
c++ 单例模式
开发语言·c++·单例模式
老胖闲聊1 小时前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.1182 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
曹勖之2 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
开发语言·python·机器人·ros2
豆沙沙包?2 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
军训猫猫头3 小时前
96.如何使用C#实现串口发送? C#例子
开发语言·c#
liuyang-neu3 小时前
java内存模型JMM
java·开发语言
我很好我还能学5 小时前
【面试篇 9】c++生成可执行文件的四个步骤、悬挂指针、define和const区别、c++定义和声明、将引用作为返回值的好处、类的四个缺省函数
开发语言·c++
蓝婷儿5 小时前
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
开发语言·python·学习