当前位置: 首页 > news >正文

Lua—元表(Metatable)

原表解析

在 Lua table 中我们可以访问对应的 key 来得到 value 值,但是却无法对两个 table 进行操作(比如相加)。
因此 Lua 提供了元表(Metatable),允许我们改变 table 的行为,每个行为关联了对应的元方法。

  1. setmetatable(table,metatable): 对指定 table 设置元表(metatable),如果元表(metatable)中存在 __metatable 键值,setmetatable 会失败。
  2. getmetatable(table): 返回对象的元表(metatable)。

原表的定义

mytable={}      --普通表
mymetatable={}  --元表
setmetatable(mytable,mymetatable) --将mymetatable设置为mytable的原表--可简写如下:
mytable=setmetatable({},{})getmetatable(mytable) --会返回mytable的元表

原表的应用

1. 变量赋值
解析如下:

mymetatable={}
mytable=setmetatable({k1="v1"},{__newindex=mymetatable})mytable.newkey="v2"
print(mytable.newkey,mymetatable.newkey)
--输出:nil   v2  :普通表中不含“newkey”,会调用元方法mytable.k1="newV"
print(mytable.k1,mymetatable.k1)
--输出:newV   nil :普通表中含有K1,会进行赋值,不再调用元方法

2.元方法调用函数

mytable=setmetatable({k1="v1"},{__newindex=function(mytable,k,v)--重写元方法rawset(mytable,k,"\""..v.."\"")--rawset绕过原表机制,直接向原表中插入新键值对end})mytable.k1="new v1";mytable.k2=3;--由于初始表中不k2,则会向元表中查询元方法print(mytable.k1,mytable.k2);--输出:v1   "3"

3.合并元表

function table_max(t)--获取原表最大键--用“#”或者table.getn时,若键不连续,只会获取第一段的最大值maxk=0;for k,v in pairs(t) doif type(k)=="number" and k>maxk thenmaxk=kendendreturn maxk
end--实现两表合并
mytable=setmetatable({1,2,3},{__add=function(mytable,newtable)local mytable_maxk=table_max(mytable)for i=1,table_max(newtable) --遍历newtabletable.insert(mytable,mytable_maxk+i,newtable[i])--将newtable中的数据插入到mytable中endreturn mytableend})newtable={4,5,6}
mytable=mytable+newtablefor k,v in pairs(mytable) doprint(k.."--"..v)
end
元方法运算操作
__add“+”
__sub“-”
__mul“*”
__div“/”
__mod“%”
__unm“-”
__concat“…”
__eq“==”
__it“<”
__le“<=”

注:“__"两个下划线,__sub对应二元减(两个参数);__unm对应一元减(只有一个参数)。

相关文章:

  • c++——二叉树进阶
  • vue 中的ref
  • 多线程 2 - 死锁问题
  • c#建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能
  • MindSpore框架学习项目-ResNet药物分类-模型优化
  • CSS渲染性能优化
  • STM32实现九轴IMU的卡尔曼滤波
  • 阿里云购买ECS 安装redis mysql nginx jdk 部署jar 部署web
  • STM32-ADC模数转换器(7)
  • 数据链共享:从印巴空战到工业控制的跨越性应用
  • Axure :基于中继器的列表删除 、 列表编辑
  • 深入理解 TCP:重传机制、滑动窗口、流量控制与拥塞控制
  • arXiv2025 | TTRL: Test-Time Reinforcement Learning
  • CDGP数据治理主观题评分标准与得分策略
  • Linux平台下SSH 协议克隆Github远程仓库并配置密钥
  • ui组件二次封装(vue)
  • Android 关闭Activity切换过渡动画
  • uniapp-商城-50-后台 商家信息
  • C++ 命令模式详解
  • .Net Mqtt协议-MQTTNet(一)简介
  • 为发期刊,高校学者偷贩涉密敏感数据!国安部披露间谍案细节
  • “一节课、两小时”,体育正在回归“C位”
  • 2025上海十大动漫IP评选活动启动
  • A股三大股指低收:银行股再度走强,两市成交11920亿元
  • 晋级中部非省会第一城,宜昌凭什么
  • 司法部谈民营经济促进法:对违规异地执法问题作出禁止性规定