Lua __index __newindex元表方法学习

【Lua进阶系列】lua元方法 【Lua进阶系列】之Lua元方法案例+字段 大家好,我是Lampard~~ 欢迎来到Lua进阶系列的博客 前文再续,书接上一回。今天和大家讲解一下lua中的元方法 __index字段 说起lua那么就不得不提其元表,lua通过元表的设置实现了高级语言中的“继承”的功能。 关于lua面向对象以及元表内容可以参考这篇博客 当我们访问一个表中不存在的元素时,会执行以下三个步骤: ... 阅读详情

在学习Lua语言的元表和元方法章节中,各种网上收例子,便于理解学习。

看到一篇很好的博客,讲到了 lua 的 rawset,rawget,index,newindex的使用,具体博客见下面链接:

作者:@qingqing-zhao
本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhaoqingqing/archive/2018/11/28/10032249.html

在开头的一段代码中,作者留一下一个问题:

设置过__newindex之后,就不会调用__index了?

然后我将作者的例子,自己在linux  lua5.1 环境下执行了一遍,并加些log,且能属性table中的具体元素,这样就能看到是否在执行下面这一句时,真没进到 __index函数中去:

print(tb.server)

测试代码如下:

local tb = {}
setmetatable(tb, { __index = function()
    print("__index 000000")
    return "not find"
end })

setmetatable(tb, {

    __newindex = function(table, key, value)
    local patchKey = "version"
    print("__newindex 11111111111")
    if key == patchKey then
        print("__newindex 2222222222222")
        rawset(table, patchKey, "patch value")
    else
        print("__newindex 3333333333333")
        rawset(table, key, value)
    end
end })

print("111 table tb:")
PrintTable(tb)

tb.version = "normal version"
tb.date = "2018"
print(tb.version) --打印 补丁值
print("\n")

print("111111111-----")
print(tb.server) --打印nil,不会调用__index方法了?
print("222222222-----")

print("\n")
print(tb.date)  --打印2018

print("222 table tb:")
PrintTable(tb)

执行结果如下:

111 table tb:
  {
  }
__newindex 11111111111
__newindex 2222222222222
__newindex 11111111111
__newindex 3333333333333
patch value


111111111-----
nil
222222222-----


2018
222 table tb:
  {
   version = patch value
   date = 2018
  }

的确如作者所说,在 执行下面这一行,真没有调用 __index方法,

print(tb.server) --打印nil,不会调用__index方法了?

根据作者提出的问题,我再网上查了老半天,也没有看到能解释这种现象的。

但就在午饭时,不经意看代码发现,作者的代码上面,执行了两次 setmetatable操作,会不会第二次将第一次的 setmetatable

中的 __index 给覆盖掉了? 是不是lua的 table 只能设置一次setmetatable?

如是,我将__index和__newindex移到了一起,在一个 setmetatable进行设置,代码如下:

local tb = {}
-- setmetatable(tb, { __index = function()
    -- print("__index 000000")
    -- return "not find"
-- end })

setmetatable(tb, { 
    __index = function()
	print("__index 000000")
	return "not find"
    end,

    __newindex = function(table, key, value)
    local patchKey = "version"
	print("__newindex 11111111111")
    if key == patchKey then
	print("__newindex 2222222222222")
        rawset(table, patchKey, "patch value")
    else
	print("__newindex 3333333333333")
        rawset(table, key, value)
    end
end })

print("111 table tb:")
PrintTable(tb)

tb.version = "normal version"
tb.date = "2018"
print(tb.version) --打印 补丁值
print("\n")

print("111111111-----")
print(tb.server) --打印nil,不会调用__index方法了?
print("222222222-----")

print("\n")
print(tb.date)  --打印2018

print("222 table tb:")
PrintTable(tb)

 再次执行结果如下:

111 table tb:
  {
  }
__newindex 11111111111
__newindex 2222222222222
__newindex 11111111111
__newindex 3333333333333
patch value


111111111-----
__index 000000
not find
222222222-----


2018
222 table tb:
  {
   version = patch value
   date = 2018
  }

修改为如上,代码,则作者提出的问题就不会出现,

print(tb.server)  就会调用 _index 的函数,打印: not find

但提出了新问题:

lua 中table的setmetatable是不是只能设置一次? 多次设置是不是只有最后的一次设置才有效?

这些问题,目前还在查找和验证中,

非常感谢那篇博主的文章,让我学到不少东西,加深理解元表。

同时发现书中所说的字符串的元表都是相同的一个,验证也确实是:

local str00 = "Hello"
local str01 = "World"
print(getmetatable(str00))
print(getmetatable(str01))

输出结果:

table: 0x14eb490
table: 0x14eb490

 

 

 

 

 

 

【Lua】元表与元方法 元表与元方法简介正文元表元方法表相关常用的元方法__index__newindex__len__call算术及关系运算 元方法__add__eq__len__unm综合案例库定义元方法__tostring__pairs简介   在Lua中,元表(metatable)是一种特殊的表,用于... 阅读详情

相关推荐

Lua元表中的 __index、__newindex还有rawget 和 rawset的使用

Lua元表中的 __index、__newindex还有rawget 和 rawset的使用 Lua语言的元表(Metatable),就是允许用户重新定义表(table)的一些基本操作,这里只介绍元表的 __index 和 __newindex 方法。 创建一个元表很简单,列如: (1) local Animal = metatable({},{}) 即可创建一个元表; (2) local ...

oYuLinZuo的博客 843

Lua中的元表和元方法

Lua中每个值都可具有元表。 元表是普通的Lua表,定义了原始值在某些特定操作下的行为。你可通过在值的原表中设置特定的字段来改变作用于该值的操作的某些行为特征。例如,当数字值作为加法的操作数时,Lua检查其元表中的"__add"字段是否有个函数。如果有,Lua调用它执行加法。 我们称元表中的键为事件(event),称值为元方法(metamethod)。前述例子中的事件是"add",元方法是执行...

weixin_33973600的博客 215

【lua】元表、元方法 详解及应用

lua 元表

kinghzking的专栏 1268

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

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

weixin_65477256的博客 3427

FreeRTOS-Plus-CLI使用笔记

FreeRTOS-Plus-CLI使用笔记 一、简介 详细介绍可参考FreeRTOS-Plus-CLI官网地址入口 FreeRTOS+CLI(Command Line Interface, 命令行接口)提供了一种简单、小型、可扩展且RAM高效的方法,使FreeRTOS应用程序能够处理命令行输入。添加一条指令的步骤如下: 提供一个实现命令功能的函数 将命令映射到该功能函数 注册命令 运行命令解释器 命令行调试接口对于排查分析出现的问题提供了很好的接口,可以通过查看传感器信息判断传感器是否正常,可以查看内置

ApexYuan 6964

kettle写doris操作

文件在目录:doris-master\extension\kettle\assemblies\plugin\target\doris-stream-loader-plugins-9.4.0.0-343.zip。官方提供了doris stream load插件,下载源码编译后放到kettle的插件目录即可使用。地址:https://github.com/apache/doris.git。注意:需要doris插件或者kettle转换生成模板的私聊博主。使用PDmaner同步业务库生成建表语句。

weixin_44449054的博客 3030

在tomcat下对struts进行扩展,同时用到了usertransaction进行事务操作

在tomcat下对struts进行扩展,同时用到了usertransaction进行事务操作。我用的是struts1.1。一:使用usertransaction时要用到jotm-1.4.3.tar里的jotm包1。关于tomcat下server.xml的配置      type="javax.sql.DataSource"/>                factory     org.obje

652

密码学:一文看懂Base64算法

Base64常常在我们开发中出现,我们可能只知道它是一串乱码(看不懂的符号),知道有时候知道我们需要把一些数据进行base64编码,有时候需要进行Base64解码。但是却不知道它的作用是什么?它存在的意义是什么?还有它是如何生成的?如何编码和解码?上述的疑问相信在你读完本篇文章之后烟消云散。下面开始正文。Base64是什么?它和加密解密操作有什么关系吗?没错,这就是经过Base64编码后的字符串。对它解码后,我们获得以下内容点个关注,是对我持续创作的最大的鼓励!

Shujie 1万+

Lua元方法__index的使用方式

Lua元方法__index的使用方式。

weixin_44920016的博客 2278

深度排查:网讯网卡WX1860AL4千兆网口降速百兆的硬件陷阱

本文详细剖析了网讯网卡WX1860AL4千兆网口降速至百兆的硬件故障排查过程。通过分析千兆以太网硬件原理,提供从网线、供电到PCB走线、焊接残留的标准化检修流程,并分享两种典型硬件陷阱(线序错误与焊锡短路)的实战修复案例,为硬件工程师解决类似传输速率问题提供系统性的诊断思路与方法。

a3b4c5的博客 1111

点云体素化算法研究-3.Voxelization 三维模型体素化

体素(voxel)即体积元素的简称,是数字数据在三维空间分割上的最小的单位。体素化就是通过创建三维体素网格来表示三维物体,是一种将无序点云变为有序点云的降采样的空间数据结构方法,便于实现点云的空间卷积。激光雷达(LiDAR)| Open3D:第五节 表面重建-体素化。

周陽讀書 2066

Lua查找表元素过程(元表、__index方法是如何工作的)

Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Value对,如果尝试访问了一个表中并不存在的元素时,就会触发Lua的一套查找机制,也是凭借这个机制,才能够实现“面向对象”的。 举例说明: [plain]view plaincopyprint? tempTable={} print(t...

a752392的博客 350

【自适应滤波】自适应UKF,基于新息自适应调节Q和R,场景为雷达跟踪与滤波、MATLAB实现

本文提出了一种基于新息协方差匹配的自适应UKF(CM-AUKF)算法,用于解决噪声统计未知或时变场景下的目标跟踪问题。通过实时调整过程噪声协方差Q和观测噪声协方差R,CM-AUKF显著提升了跟踪精度和稳定性。仿真结果表明,相比传统UKF,CM-AUKF在位置和速度估计误差上分别降低了约50%和30%,且无需人工调参。该算法适用于无人机导航、雷达跟踪等动态环境,MATLAB代码可直接运行复现结果。自适应曲线显示算法能有效收敛到真实噪声参数,验证了其自适应能力。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 329

Lua中的元表与元方法学习总结(__index, __newindex)

原文:https://www.jb51.net/article/55812.htm (__newindex在下面有解释) 前言 元表对应的英文是metatable,元方法是metamethod。我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算。在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定...

u012861978的专栏 1538

Jetson Nano 实战指南:深度学习环境配置与 YOLOv5 边缘端部署解析

Jetson Nano是NVIDIA推出的嵌入式AI开发板,凭借其强大的GPU计算能力和完善的软件生态系统,成为边缘AI部署的理想平台。本教程源于作者团队参加2024中国机器人大赛暨RoboCup机器人世界杯中国赛机器人先进视觉3D识别赛道的实战经验,是一份经过验证的环境部署指南。

FJN110的博客 152

从原理到落地:Java+TensorRT打造YOLO模型GPU极致推理方案

Java+TensorRT的YOLO模型GPU加速方案,核心是通过JNI桥接实现Java与TensorRT的高效交互,结合TensorRT的底层优化能力,最大化GPU算力。该方案既保留了Java后端的工程化优势(如易维护、生态完善),又解决了AI模型推理的性能瓶颈,可落地于实时视频分析、智能监控、工业质检等场景。基于TensorRT Dynamic Shape实现多尺寸输入的自适应优化;结合Java的协程(Virtual Thread)提升异步推理的并发效率;

2601_94871597的博客 766

Lua初学习 9-14_04 元表中的 __index 和 __newindex 元方法;以及跟踪teble属性变化(get set)...

1:__index a = { name = "a name",age = 99} b = { age = 100} setmetatable(b,a) print(b.name) -----> nil print(b.age) ----> 100 a.__index = a print(b.name) ----> a name print(b.age) ---...

weixin_30338743的博客 140

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

理解Lua中“元表和元方法“

为何要设置元表.__index=元表,搞懂元表和元方法的使用,__newindex, __tostring,__call等元方法。

QNBZ的博客 440

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Lua面向对象编程 (__index、__newindex、__call、__add)

Lua面向对象编程 1、__index学习 【前置知识】 setmatatable:设置元表 setmetatable(table1, metatable) metatable里一般实现__index、__newindex、__add等元方法实现对table的某种操作 当__index为表时 通过键值访问table时,如果没有这个键,那么Lua就会寻找table的metatable中__index表里的key键 性质很像继承关系的父亲 【代码】 t1 = {area = 0}.

ccsu_deer 2514

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

lua元表、元方法

lua元表、元方法

伟庭的博客 1778

Lua 学习元表,元方法

前言 元表与元方法的概念 Lua中每个值都可具有元表。元表是普通的Lua表,定义了原始值在某些特定操作下 的行为。例如,当table作为加法的操作数时,Lua检查其元表中的”__add”字段是否有 个函数。如果有,Lua调用它执行加法。我们称元表中的键为事件(event),称值为 元方法(metamethod)。前述例子中的事件是”add”,元方法是执行加法的函数。 Lua创建新的table...

liaosheng:) 1万+

Lua 元表及常见元方法

Lua 元表及常见元方法

weixin_46935110的博客 9632

lua 关于__index,__newindex的理解

table存在两种行为:查询和修改(赋值),我们可以通过元方法__index和__newindex来改变table的这两种行为。 __index主要用于table的查询 table[key] 的访问过程,首先检查table表中是否存在key的字段,如果有则返回,否则检查是否有__index的元方法,没有返回nil,有则查找元方法。 __index元方法可以是不一定是一个函数,还可以是一个

2月7号遇见你 1万+

[Lua]表相关元方法

关于算术运算和关系元运算的metamethods都定义了错误状态的行为,他们并不改变语言本身的行为。针对在两种正常状态:表的不存在的域的查询和修改,Lua也提供了改变table的行为的方法。元方法是元表的方法。 _index 当我们访问一个表的不存在的域,返回结果为nil,这是正确的,但并不一定正确。实际上,这种访问触发lua解释器去查找__index metamethod:如果不存在,返回结...

超越 1758

LUA语言中神奇的__index和__newindex

LUA语言中神奇的__index和__newindex标签(空格分隔): lua今天有幸学习了LUA语言中可以说是最强大的功能:__index和__newindex。趁着刚看完还没有忘记,赶紧写个笔记冷静一下。1. 回顾元表(metatable)在LUA语言中,每个值都有一套预定义的操作集合,我们可以对两个数加减,对字符串连接、删减等等。不过,LUA里面并没有把table变量的操作定义好。可以理解,

Cyiano的博客 1万+

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

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

2301_82300081的博客 1451
上一篇: Cmake Practice学习遇到问题
下一篇: __sync_fetch_and_add函数(Redis源码学习)
highmaple
博客等级 码龄16年 0粉丝 15原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值