首页 > 其他分享 >15.元表与元方法

15.元表与元方法

时间:2024-04-13 20:12:28浏览次数:18  
标签:元表 15 -- t1 meta key table 方法

元表,即 Lua 中普通 table 的元数据表,而元方法则是元表中定义的普通表的默认行为。
Lua 中的每个普通 table 都可为其定义一个元表,用于扩展该普通 table 的行为功能。例如,
对于 table 与数值相加的行为,Lua 中是没有定义的,但用户可通过为其指定元表来扩展这
种行为;再如,用户访问不存在的 table 元素,Lua 默认返回的是 nil,但用户可能并不知道
发生了什么。此时可以通过为该 table 指定元表来扩展该行为:给用户提示信息,并返回用
户指定的值。

(1) 重要函数
元表中有两个重要函数:
 setmetatable(table,metatable):将 metatable 指定为普通表 table 的元表。
 getmetatable(table):获取指定普通表 table 的元表。

(2) _ index 元方法
当用户在对 table 进行读取访问时,如果访问的数组索引或 key 不存在,那么系统就会
自动调用元表的
index 元方法。该重写的方法可以是一个函数,也可以是另一个表。如果
重写的
_index 元方法是函数,且有返回值,则直接返回;如果没有返回值,则返回 nil。
元方法是一个函数如下:

--元表与元方法
t1 = {"a", age = 23,"b","c",name = "王五", "d",100}
--定义一个元表
meta = {}
--关联原始表和元表
setmetatable(t1,meta)

function meta.__index(tab,key)
	print("key "..key.." 在原始表中不存在")
end

print(t1[99])
print(t1[100])

//输出结果如下:
key 99 在原始表中不存在
nil
key 100 在原始表中不存在
nil

元方法是另一个表如下

t1 = {"a", age = 23,"b","c",name = "王五", "d",100}
--定义一个元表
meta = {}

--定义一个元表
meta = {}

--定义另一个普通表
other = {}
other[99] = 999
other[100] = 1000
--关联原始表和元表
setmetatable(t1,meta)
meta.__index = other

print(t1[99])
print(t1[100])
//输出结果如下:
999
1000

标签:元表,15,--,t1,meta,key,table,方法
From: https://www.cnblogs.com/gom-linwei/p/18133287

相关文章

  • microsoft全球GlobalMLBuildingFootprints下载方法
    website:https://github.com/microsoft/GlobalMLBuildingFootprints?tab=readme-ov-filePython代码Start"""Thissnippetdemonstrateshowtoaccessandconvertthebuildingsdatafrom.csv.gztogeojsonforuseincommonGIStools.Youwillneedtoi......
  • VMware15显示“该虚拟机要求使用 AVX2,但 AVX 不存在”
    版本:VM:15.5.7build-17171714虚拟机:rhel-8.8-x86_64-dvd地址:D:\Users\q2383\Documents\VirtualMachines\RedHatEnterpriseLinux864位\RedHatEnterpriseLinux864位.vmx1.修改内容点击查看代码.encoding="GBK"config.version="8"virtualH......
  • 15、数据库加固-redis 加固
    1.禁止网络访问Redis服务更改配置文件,使服务监听本地回环地址修改redis配置文件:vi安装路径/redis.conf确保:bind127.0.0.1(::1:表示ipv6回环地址)2.设置防火墙过滤浏览(与禁止网络访问相对应,两者设置一种即可)设置iptables防火墙,确保访问源安全允许某源地址访问服务器的......
  • P1155 [NOIP2008 提高组] 双栈排序
    P1155[NOIP2008提高组]双栈排序有思维的二分图染色题。对于“双”类的题目,我们通常分开考虑单个时的性质。对于一个栈,有一个基本的定理:若出现\(i<j<k\),有\(a_k<a_i<a_j\),那么一定不合法,即没有合法的出栈顺序使之有序。对于两个栈,我们相当于把序列分成两部分,使每部分之间......
  • P1157 组合的输出
    P1157组合的输出题目排列与组合是常用的数学方法,其中组合就是从\(n\)个元素中抽出\(r\)个元素(不分顺序且\(r\len\)),我们可以简单地将\(n\)个元素理解为自然数\(1,2,\ldots,n\),从中任取\(r\)个数。现要求你输出所有组合。例如\(n=5,r=3\),所有组合为:\(123,124,125......
  • 多通道的AXI仲裁方法V3
    https://www.cnblogs.com/VerweileDoch/p/18030653V2。读moduleAribe_state_rd#(parameterintegerM_AXI_ID_WIDTH=1,parameterintegerM_AXI_ADDR_WIDTH=32,parameterintege......
  • 查看自动类型推导结果的方法
    在《深入解析C++的auto自动类型推导》和《深入解析decltype和decltype(auto)》两篇文章中介绍了使用auto和decltype以及decltype和auto结合来自动推导类型的推导规则和用法,虽然确定类型的事情交给编译器去做了,但是在有的时候我们可能还是想知道编译器推导出来的类型具体是什么,下面......
  • Veritas Enterprise Vault 15.0 (Windows) - 自动捕获数据并归档信息
    VeritasEnterpriseVault15.0(Windows)-自动捕获数据并归档信息信息归档解决方案,确保合规与有效的信息治理请访问原文链接:VeritasEnterpriseVault15.0(Windows)-自动捕获数据并归档信息,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgEnterpriseVault独......
  • docker 报错:不能选择设备驱动 could not select device driver 的解决方法(实测有效)
    Ubuntu安装完docker引擎后,在创建容器的时候指定 --gpusall,出现报错如下:报错: docker:Errorresponsefromdaemon:couldnotselectdevicedriver""withcapabilities:[[gpu]].解决该问题还需要安装Nvidia-docker,本篇参照Nvidia官网。NVIDIAContainerToolkit在许多......
  • Sql Server对等复制中将截断字符串或二进制数据。 (源: MSSQLServer,错误号: 8152)
    近期发现好好的复制突然出现了报错,导致备份库数据不一致的问题,如下 一直以为是发布数据库进行了DDL操作没有同步到这边来,导致数据同步时长度不够导致的,结果把表都检查了一遍也没发现啥不对劲最后只好去找相关资料,结果找到了官方资料(目前老项目用的14版本) 这边有几个......