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

基于淘宝商城用户购物行为数据分析系统

本文使用HIve+superset技术对阿里云天池提供的淘宝用户购物数据进行处理分析,得到有价值的信息并对平台提出有建设性意义的意见。

m0_51388399的博客 2819

用Omniverse Kit开发第一个USD插件:从环境配置到实战案例(Python 3.7版)

本文详细介绍了如何使用NVIDIA Omniverse Kit和Python 3.7开发第一个USD插件,涵盖从环境配置到实战案例的全过程。通过创建可实时同步材质属性的USD插件,开发者可以快速掌握Omniverse开发框架,提升3D内容创作效率。

x8y9z0的博客 586

在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

vivado实现SDI接口

XAPP1249,用来介绍UHD_SDI的实现。

Huskar_Liu的博客 7076

Lua元方法__index的使用方式

Lua元方法__index的使用方式。

weixin_44920016的博客 2278

AI对嵌入式的冲击分三波,大多数人只看到了第一波

摘要:AI对嵌入式行业的冲击将分三波递进:第一波(已发生)是代码生成,AI能完成底层驱动配置;第二波(1-2年内)是架构设计,AI将参与系统方案制定;第三波(2-3年)是需求验证,AI能穷举测试用例但无法替代安全决策。每波冲击都将重新定义工程师的价值标准,经验型工程师若不能将隐性知识转化为显性规则将面临淘汰。作者指出,完全不用AI的人第一波就会被淘汰,而仅满足于第一波应用的人将在后续冲击中落后。

u010898524的博客 962

注意力机制详解

注意力机制详解Attention机制由来Attention定义Encoder-Decoder框架存在问题:Attenion机制的引入Attention机制的类别Hard AttentionSoft AttentionGlobal AttentionLocal AttentionSelf AttentionMulti-head Attention附录—Transformer全局视角Tensor视角Encoder部分Self-AttentionSelf-Attention向量计算Self-Attention的矩

weixin_43236310的博客 1万+

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

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

a752392的博客 350

基于Simulink的无线充电系统LCC补偿网络建模与控制

本文详细介绍了基于Simulink的无线充电系统LCC补偿网络建模与控制方法。首先分析了LCC补偿网络的恒流输出、软开关实现和抗偏移能力等优势,并对比了不同补偿拓扑特性。随后分步骤讲解了Simulink建模流程,包括LCC主电路构建、关键参数设计、双闭环控制系统实现等核心环节。重点阐述了移相控制策略和软开关验证方法,提供了系统效率计算和抗偏移测试的调试技巧。最后展示了仿真结果,在耦合系数变化20%时,闭环系统仍能保持输出电压稳定在±2%波动范围内。文章还探讨了工程扩展方向,并针对常见问题给出了解决方案,为无

xiaoheshang_123的博客 539

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

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

u012861978的专栏 1538

【20260309】【亲测可用】【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled

【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection。

奶爸的编程之路,也就一周冷个三天 2万+

【教程4>第10章>第13节】基于FPGA的图像双边滤波开发——单通道双边滤波Verilog实现

本文介绍了基于Vivado 2022.2的单通道高斯滤波FPGA实现方案。主要内容包括:1)采用3×3窗口像素提取、高斯权值计算、exp指数运算等模块构建双边滤波系统;2)详细分析了Verilog HDL实现的顶层设计文件,包含窗口数据生成、指数计算、混合权重、归一化处理等关键模块;3)展示了图像双边滤波器的RTL结构图。该设计为后续实现RGB三通道图像高斯滤波及MATLAB联合仿真奠定了基础。

FPGA/MATLAB学习教程/源码/项目合作开发 262

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

QNBZ的博客 440

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

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

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

精雕软件(JDpaint) 5.5 绿色版

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

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、付费专栏及课程。

余额充值