Lua_Metatable元表

Lua元表(Metatable)详解 Lua 元表(Metatable)是 Lua 最强大的特性之一,允许自定义 table 的行为。本文详细介绍了元表的概念、核心元方法及其应用场景: 元表本质是包含特殊键(元方法)的普通表,通过 setmetatable/getmetatable 操作 核心元方法包括: __index(访问不存在键) __newindex(写入不存在键) 运算符重载方法(__add, __sub等) __call(使表可调用) __tostring(自定义输出) 实战应用示例: 实现继承和只读表 向量运算重载 函数式对象 自 阅读详情
--元表,元表附属于表,用于表的扩展,是更底层的东西。
--元表的作用多种多样,其中一个就是可以在对普通表操作时方法的重载,用于扩展,因此一般情况下定义好后不需要再次修改元表。
----比如让两个表进行相加,如果没有元表的话直接相加编译器会报错的。
----还有就是用print输出表时,是直接输出这个表的内存块名,用了元表就可以很方便的输出表的元素

tab1 = {1,2,3,4,5,6}
met1 = {}
tab2 = setmetatable(tab1,met1)
met2 = getmetatable(tab1)

print(tab1,tab2) --输出:table: 00A395A0	table: 00A395A0
print(met1,met2) --输出:table: 00A39A50	table: 00A39A50

----------------------------------------------------

-- __metatable关键字,可以保护元表,禁止用户访问元表中的成员或者修改元表。

tab = setmetatable({"Lua","Java","C#","C++"} , {__metatable="lock"} )
print(getmetatable(tab)) --输出:lock

---------------------------------------------------------

--__index关键字,用于访问普通表不存在的Key时,所调用元表的扩展方法

tab1 = {1,2,3,4,5,6}
met1 = {
	__index = function(tab,key)
		print("tab",tab)
		print("调用了元表的__index方法")
		table.insert(tab1,key) --table表插入方法,参数1:table,参数2:[index]位置,参数3:value
	end}
tab2 = setmetatable(tab1,met1)
met2 = getmetatable(tab1)

function OnContainTab(tab,value)
	for k,v in pairs(tab) do
		if v == value then
			print("搜索到目标 k:"..k.." v:"..v)
			return true
		end
	end
	return false
end

print("tab1",tab1) --输出:tab1	table: 00B196D0
print("表的个数为: "..table.getn(tab1)) --输出:表的个数为: 6
print(tab1[100]) --输出:tab	table: 00B196D0 | 调用了元表的__index方法 | nil
print("表的个数为: "..table.getn(tab1)) --输出:表的个数为: 7
OnContainTab(tab1,100) --输出: 搜索到目标 k:7 v:100

---------------------------------------------------------------

-- __newindex关键字,在table添加新的数据时,会调用这个

tab1 = {1,2,3,4,5,6}
local met1 = {
		__newindex = function(tab,key,value) --元表关键字支持函数
		print("普通表中未找到Key:"..key)
		rawset(tab,key,value) --添加新的键值对
		--table.insert(tab,key,value)  --添加新的键值对
	end
	}

function OnContainTab(tab,value)
	for k,v in pairs(tab) do

		if v == value then
			print("搜索到目标 k:"..k.." v:"..v)
			return true
		end
		if k == value then
			print("搜索到目标 k:"..k.." v:"..v)
			return true
		end
	end

	return false
end

newtab1 = setmetatable(tab1,met1)

newtab1[7] = "qi" --输出:普通表中未找到Key:7
OnContainTab(newtab1,7) --输出:搜索到目标 k:7 v:qi


tab2 = {1,2,3,4,5,6}
tab3 = {}
local met2 = {
		__newindex = tab3 --元表关键字还支持Table
	}

newtab2 = setmetatable(tab2,met2)

newtab2[7] = "qi" --由于元表__newindex指向了tab3,因此当普通表tab2的索引查不到Key时,会自动地赋值给tab3
print(tab2[7]) --输出:nil
print(tab3[7]) --输出:qi 

---------------------------------------------------

-- add关键字,在table进行数学操作符时,进行扩展
tab1 = {1,3,5}
tab2 = {2,4,6}

local met1 = {
		__add = function(tab_1,tab_2) --add关键字,参数1:tab1,参数2:tab2
		for k,v in pairs(tab_2)do
			table.insert(tab_1,v)
		end
		return tab_1
	end
	}

newtab1 = setmetatable(tab1,met1)

tab3 = tab1+tab2

for k,v in pairs(tab3) do
	print(k,v) --输出:1	1 | 2	3 | 3	5 | 4	2 | 5	4
end

----------------------------------------------------

-- __call关键字,可把table当做函数来使用
tab1 = {1,3,5}

local met1 = {
		__call =
		function(tab,...) 使用"...",用于处理所有参数
			print(...)
			return tab
		end
	}

newtab1 = setmetatable(tab1,met1)
newtab1(123,123123) --输出:123	123123

------------------------------------------------------

-- __tosting关键字,用于直接打印table时,所扩展的方法

tab1 = {"一","二","三"}
local met1 = {
		__tostring =
		function(tab)
			local string = ""
			for k,v in pairs(tab) do
				string = string..k.." "..v.."|"
			end
			return string
		end
	}

newtab1 = setmetatable(tab1,met1)

print(newtab1) --元表没有__tostring关键字则输出:table: 00DB9438,加了则输出:1 一|2 二|3 三|

 

43_Lua Metatable元表 Lua的元表(Metatable)是一种特殊的表,它能改变普通表的行为,让表可以响应特定操作。通过设置特定键值(以双下划线__开头),即元方法(metamethods),可以定义表在算术、比较、索引等操作下的行为。 阅读详情

相关推荐

MacOS上VScode配置PlatformIO Core的疑难杂症与提速实战

本文详细解析了在MacOS上使用VScode配置PlatformIO Core时遇到的安装卡死、新建项目缓慢等常见问题,并提供了官方脚本安装、网络优化、命令行预下载等实用解决方案。通过环境变量配置和镜像源加速,大幅提升开发效率,特别适合ESP32等嵌入式开发场景。

weixin_42567046的博客 220

Lua元表(Metatable)相关知识点总结

设置元表 元表是lua的核心语法之一。 作用: 类似“继承”,将两个table关联到一起,也可以理解为“附加”。 方法介绍: setmetatable(table,metatable): 对指定 table 设置元表(metatable),如果元表(metatable)中存在__metatable 键值,setmetatable 会失败。 getmetatable(table): 返回对象的元表(metatable)。 代码: mytable = {} --

lcy的博客 1859

5分钟搞懂超分算法:从插值到深度学习的实战对比(附Python代码)

本文系统对比了从传统插值到深度学习的主流超分算法,包括最近邻、双线性、双三次插值,以及基于边缘、统计模型和SRCNN、ESPCN、SRGAN等深度学习模型。通过实战代码和决策框架,帮助开发者根据图像质量、速度、资源等需求,快速选择最合适的超分辨率算法,实现从低清到高清的有效转换。

pp12345的博客 428

Lua 中的 `setmetatable` 函数详解与应用

函数是 Lua 强大而灵活的机制之一。通过为表设置元表,开发者可以自定义表的行为,赋予它们新的功能。无论是通过__index实现动态键值查找,还是通过__add实现自定义运算,为 Lua 的轻量级设计增添了灵活的扩展性。这种机制特别适用于构建复杂的数据结构、实现对象系统、代理数据访问等场景。在实际项目中,合理利用元表和元方法,能极大提升 Lua 代码的表现力和可维护性。

weixin_65477256的博客 3427

Chroma向量数据库实战:用Python快速搭建本地知识库(附中文诗词检索案例)

本文详细介绍了如何使用Chroma向量数据库和Python快速搭建本地知识库,并附有中文诗词检索的实战案例。通过解析核心概念、数据准备、向量化及智能检索实现,展示了Chroma在处理中文语义搜索时的轻量级与易用性,为开发者构建AI应用原型提供了实用指南。

weixin_29221753的博客 479

自考计算机系统原理(第六章计算机系统概论)-13015

名词解释 I/O 硬件 I/O软件 用户空间I/O软件 内核空间I/O 软件 系统调用处理程序 系统调用服务例程 设备驱动程序 中断服务程序 系统级1/O函数 虚拟文件系统 文件描述符 文件元数据 流缓冲区 索引节点 目录文件 目录项 系统打开文件表 磁盘高速缓存 高速缓存 RAM I / O 控制方式 程序直接控制I/O 就绪状态 中断控制I/O 中断屏蔽字 多重中断 中断嵌套 DMA 方式 DMA 控制器 设备控制器 I/O端口 控制端口 数据端口 状态端口 I/O 地址空间 独立编址方式 统一编址方

qq_23872947的博客 1150

Lua中metatable说明及setmetatable的使用

1、setmetatable setmetatable( obj, { __index = mission_t } ) return obj mission_t为对应模块的文件名。

Shan_mei的专栏 2万+

三维重建笔记_光束平差法(Bundle Adjustment, BA)

目录 1 光束平差法(Bundle Adjustment, BA) 1.1 SFM (Structure‐from‐Motion) 定义 问题描述 1.2 重投影误差 (Reprojection Error) 目标函数 1.3 使用 Levenberg‐Marquardt Algorithm 进行优化 问题描述 简化目标函数 参考 Gauss‐Newton Method ...

惊鸿一博 2万+

Lua 学习之元表(metatable) 一

对指定 table 设置元表(metatable),如果元表(metatable)中存在 __metatable 键值,setmetatable 会失败。因此 Lua 提供了元表(Metatable),允许我们改变 table 的行为,每个行为关联了对应的元方法。类似于C++中的运算符重载。在 Lua table 中我们可以访问对应的 key 来得到 value 值,但是却无法对两个 table 进行操作(比如相加)。返回对象的元表(metatable)。对于__eq遇到的特殊情况。

tydmmcc的博客 926

国内合规开通ChatGPT Plus实操指南:银行卡绑卡与支付全解析

ChatGPT Plus 是 OpenAI 官方推出的高级订阅服务,基于 GPT-4o 多模态大模型提供语音交互、图像理解与长上下文处理能力。其核心使用前提在于完成合规的国际支付绑定,而非网络接入方式。技术原理上,OpenAI 采用 Stripe 支付网关进行风控校验,重点匹配银行跨境权限、卡片类型(仅支持 Visa/Mastercard/Amex 信用卡)、BIN 号段及地理位置一致性。该机制决定了95%的绑卡失败源于银行端配置缺失或卡片不兼容,而非网络问题。实际应用中,PayPal 作为中间支付层可显著

chuannaoxuan4674的博客 1938

使用abagen工具箱获取基于脑区的基因表达矩阵

脑区模板定义了您感兴趣的脑区的空间位置。abagen提供了一些预定义的脑区模板,您可以选择使用,也可以使用自定义的脑区模板。它提供了一种简便的方式来获取基于脑区的基因表达矩阵。abagen需要使用Allen脑图谱数据来获取基因表达矩阵。您可以使用abagen内置的下载功能来获取这些数据。这就是使用abagen工具箱获取基于脑区的基因表达矩阵的详细步骤。通过按照上述步骤操作,您可以轻松获取并使用Allen脑图谱数据中的基因表达信息。一旦您加载了脑区模板,您可以使用abagen来获取基于脑区的基因表达矩阵。

web_bug407的博客 1326

Lua中的metatable详解

这篇文章主要介绍了Lua中的metatable详解,本文详细讲解了metatable的作用、定义操作符行为、为 Lua 函数库提供支持等内容,需要的朋友可以参考下 Lua 中 metatable 是一个普通的 table,但其主要有以下几个功能: 1.定义算术操作符和关系操作符的行为 2.为 Lua 函数库提供支持 3.控制对 table 的访问 Metatables 定义操作符行为

cbbbc 4052

禾赛激光雷达AT128P/海康相机(1):ROS环境设备驱动

sudo cp *.so /opt/MVS/lib/64/ # 复制当前文件夹中所有.so文件 到 “/opt/MVS/lib/64/” 文件中。将相应的.so文件复制到 /opt/MVS/lib/64/。我解压的是x86_64的,解压之后,打开,再解压MVS。然后在上一层,也就是选择x86_64那一层打开终端。新建一个工作空间,或者打开自己的工作空间。)包放在src内,并解压,然后编译。MVS V2.1.2下载之后解压,// 驱动代码下载到src文件里面。// 特定文件夹中打开终端。

努力努力努力 882

在Lua中,Metatable元表如何操作?

Metatable是一个普通的Lua表,它用于定义原始值在特定操作下的行为。每个表都可以有一个元表,这个元表通过特殊的键(以双下划线__开头)来定义元方法(metamethods),这些元方法可以响应不同的事件。Metatable可以控制对象在算术操作、顺序比较、连接、长度操作和索引时的行为。为什么需要元表?为了给用户提供一种机制来定义非预定义的操作行为。例如,两个表不能直接相加,但是通过元表我们可以定义__add元方法来实现这一点。

2301_82300081的博客 1451

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Lua 元表(Metatable)

1.在表中查找,如果找到,返回该元素,找不到则继续2.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。3.判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil;如果 __index 方法是一个表,则重复 1、2、3;如果 __index 方法是一个函数,则返回该函数的返回值。该部分内容来自作者寰子:https://blog.youkuaiyun.com/xocoder/article/details/9028347。

jiangzhmi的博客 1516

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Lua元表(Metatable)

Lua元表是用于扩展表行为的特殊表,通过元方法(如__add、__index等)可自定义表的操作方式。关键功能包括:1)定义算术/关系运算;2)处理不存在键的访问(__index);3)拦截赋值操作(__newindex);4)使表可调用(__call)。使用setmetatable/getmetatable管理元表关联,rawget/rawset可绕过元方法。元表支持面向对象特性如继承(通过__index),但需谨慎使用以避免性能和维护问题。

Evan8的博客 642

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Lua元表metatable理解

lua元表metatable理解metatable设置方法:以下实例演示了如何对指定的表设置元表:__index元方法总结__newindex 元方法__call 元方法定义元方法__call 最近总是遇到如果通过脚本语言搭建一个OOP结构,于是针对Lua进行了解,发现需要用到其元表metatable来实现,则对Lua的metatable进行一个理解的整理 理解: 名称:元表,本身也是一个tabl...

Aaron's Coding Life 422

Lua 元表(Metatable)——从入门到放弃

Lua 元表(Metatable) 在 Lua table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作。 因此 Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。 例如,使用元表我们可以定义Lua如何计算两个table的相加操作a+b。 设置元表和返回元表 setmetatable(table,metatable): 对指定 table 设置元表(metatable),如果元表(metatable)中存在 __m

lovemo的博客 312

Lua 元表(Metatable)深入解析

在 Lua 中,每个表都可以有一个元表。元表是一个表,它定义了原始表的行为。当 Lua 尝试对一个表执行某些操作时,它会检查这个表是否有元表,并查询元表以确定如何处理这个操作。通过这种方式,元表允许我们自定义表的某些行为,例如定义如何进行索引、如何进行算术运算等。

csbysj2020 1376

Lua元表(Metatable)简易教程

Lua如何像python一样定义类和方法,那就得使用MetaTable(元表)。本文就Lua元表的创建,方法添加和使用加以说明。以向量(元表)为例,定义了向量的加法、内积等运算并给出了对应输出结果

体会编程语言独到的美 725

十四、一起学习Lua 元表(Metatable)

1.在表中查找,如果找到,返回该元素,找不到则继续2.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。3.判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil;如果 __index 方法是一个表,则重复 1、2、3;如果 __index 方法是一个函数,则返回该函数的返回值。该部分内容来自作者寰子:https://blog.youkuaiyun.com/xocoder/article/details/9028347。...

m0_66404702的博客 322
上一篇: AssetBundle__Unity 依赖打包
下一篇: Lua_常用的函数库
Le_Sam
博客等级 码龄11年 342粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值