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

相关推荐
二狗哈6 小时前
Cesium快速入门15:图元Primitive创建图像物体
开发语言·javascript·3d·webgl·cesium·地图可视化
lljss20206 小时前
C# 定时器类实现1s定时器更新UI
开发语言·c#
白杨攻城狮6 小时前
C# 关于 barierr 心得
开发语言·c#
zhglhy6 小时前
Jaccard相似度算法原理及Java实现
java·开发语言·算法
catchadmin6 小时前
PHP 8.5 容器化实战指南
开发语言·php
nono牛6 小时前
完整bash语法教程:从零到专家
开发语言·chrome·bash
啥都不懂的小小白6 小时前
Java日志篇3:Logback 配置全解析与生产环境最佳实践
java·开发语言·logback
江沉晚呤时6 小时前
延迟加载(Lazy Loading)详解及在 C# 中的应用
java·开发语言·microsoft·c#
Hard but lovely6 小时前
C/C++ ---条件编译#ifdef
c语言·开发语言·c++
董世昌416 小时前
js怎样控制浏览器前进、后退、页面跳转?
开发语言·前端·javascript