首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么lua模块要将其表的__index设置为自身?

Lua模块将其表的__index设置为自身的原因是为了实现模块的继承和扩展。

在Lua中,模块通常被实现为一个表,其中包含了模块的函数、变量等内容。当我们使用模块中的某个函数或变量时,Lua会在该表中查找对应的键值。如果找不到,则会继续查找__index元方法所指向的表。

将模块的__index设置为自身,可以实现模块的继承。当一个模块被另一个模块继承时,继承的模块可以通过设置__index元方法指向被继承的模块,从而在自身找不到对应键值时,继续在被继承的模块中查找。

此外,将模块的__index设置为自身还可以实现模块的扩展。通过在模块中定义一个新的表,并将该表的__index设置为模块自身,可以在不修改原有模块代码的情况下,为模块添加新的函数或变量。

总结一下,将Lua模块的__index设置为自身的优势和应用场景包括:

  1. 实现模块的继承,让一个模块可以继承另一个模块的函数和变量。
  2. 实现模块的扩展,为一个模块添加新的函数和变量,而不需要修改原有模块代码。
  3. 提高代码的可维护性和可扩展性,使得模块的功能可以更灵活地被复用和定制。

腾讯云相关产品和产品介绍链接地址: 腾讯云函数计算(SCF):https://cloud.tencent.com/product/scf 腾讯云云开发(CloudBase):https://cloud.tencent.com/product/tcb 腾讯云云原生应用引擎(TKE):https://cloud.tencent.com/product/tke

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么 HashMap 容量大小设置2N次方?

我说小朋友:如果想指定 HashMap 对象容量得用2N次方 。假如不是2N次方那么在第一次put 元素时候也会自动把容量设置比传入参数大最小2N次方,并不是你指定这个值。...HashMap 是基于哈希 Map 接口实现,线程不安全,且不保证映射顺序。 HashMap 存储数据依赖是数组和[链表|红黑树],具体链表和红黑树之间如何转换细节此文不做详细介绍。...如果初始容量6,那么出现哈希冲突几率就会增加了。   ...而是在实例化 HashMap 对象时,如果初始容量大小不是2N次方则会把 threshold 设置成比传入初始容量大最小2N次方。...哦,前面说为什么计算出来散列值需要再让高16位和低十六位做异或运算,主要是让参与与运算位同时具有高位和低位特征,来减少哈希碰撞次数。

1.4K00

【Unity面试篇】Unity 面试题总结甄选 |热更新与Lua语言 | ❤️持续更新❤️

下载AssetBundle,首先将其下载到本地设备中,然后再通过AsstBundle加载模块将资源加到游戏之中。...Lua中 点和冒号区别 点 :无法传递自身,需要显示传递 冒号 :隐式传递自身 17....Lua没有实现,封装一个函数,递归拷贝table中所有元素,以及设置metetable元。...如果访问不存在数据,由__index提供最终结果 如果对不存在数据赋值,由__newindex对数据进行赋值 __index元方法可以是一个函数,Lua语言就会以【】和【不存在键】参数调用该函数...此方法会返回一个函数(模块加载器)和一个传给这个加载器参数。或返回一个描述为什么没有找到这个模块字符串或者nil。

60631

Lua和元方法

总之,任何配置都是合法。 算术运算相关元方法 假设有一个用来表示集合模块,该模块还有一些用来计算集合并集和交集等函数。...在新版本中只多了一行,即将 mt 设置函数 Set.new 所创建LUA function Set.new(l) -- 第二个版本 local set = {}...在之前集合示例中,我们已经定义了一个将集合表示字符串函数。因此,只需要在元设置tostring字段: mt....跟踪对表访问 假设我们跟踪对某个所有访问。由于index和newindex元方法都是在索引不存在时才有用,因此,捕获对一个访问唯一方式是保持是空。...access to elemetn 2 -- hello 元方法 index 和 newindex 按照我们设计规则跟踪每一个访问并将其重定向到原来中。

59940

Lua学习笔记

如果直接访问未初始化全局变量,Lua也不会报错,直接返回nil。如果不想再使用该全局变量,可直接将其nil。...一个table甚至可以作为它自己,用于描述其特有的行为。在Lua代码中,只能设置table,若要设置其它类型值,则必须通过C代码来完成。...编写模块基本方法: --将模块设置require参数,这样今后重命名模块时,只需重命名文件名即可。 local modname = ......void lua_settop(lua_State* L, int index); --将栈顶设置指定索引值。...通常用于保存多个模块共享数据。我们可以通过LUA_REGISTRYINDEX索引值来访问注册。 如果需要保存一个模块私有数据,即模块内各函数需要共享数据,应该使用环境。

3K60

Lua 语法基础 | Nmap 脚本

Lua语言同样可以表示包和其他对象 当调用函数 math.sin 时,其实在 Lua 语言中,实际含义时以字符串 sin 键 检索 math Lua 语言中本质上是一种辅助数组(associative...exp3 如果不想设置循环上线,可以将exp3 设置 math.huge 7.2.5 泛型 for 泛型for遍历迭代函数返回所有值 以后再细究 7.3 break、return和 goto break...加载函数就是 loadlib 执行结果,也就是一个被表示 Lua 函数C语言函数 luaopen_xxxx 无论require 哪种模块,如果加载函数有返回值,那么require 会返回这个值,然后将其保存在...so > ----------------------- 查找时候会用 模块名去替换其中问号,之后进行匹配 13.1.3 搜索器 13.2 Lua 语言模块编写基本方法 最简单方法是 创建一个并将所有需要导出函数放入其中...(w.width) 此时会发现,虽然 w 没有定义 width ,但是可以直接调用 Lua 语言使用元方法 __index 字段来实现继承 __index 方法可以赋值一个函数,同时可以是一个 上面函数也等价于

2K50

Lua环境(Environment)

为了便于实现这种操作方式,Lua语言将全局环境自身保存在全局变量_G中。...w中,并将其后可选点保存在变量d中。...但是,允许值nil全局变量也不难,只需要引入一个辅助来保存已声明变量名称即可。一旦调用了元方法,元方法就会检查该,看变量是否是未声明过。...环境解决这个问题提供了一种有趣方式。一旦模块主程序有一个独占环境,则不仅该模块所有的函数共享了这个环境,该模块全局变量也进入到了这个环境中。...在此前代码中,add会从其环境中得到new,也就是M.new。 这种方法模块提供了一种良好支持,只需要程序员多做一点额外工作。

1.1K20

【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态

0} 3 --设置索引,想模拟类的话,这步操作很关键 4 Class....而设置和__index元方法这一步也是必不可少,我们需要借助它查找机制来实现类继承和多态等。...4 SubClass = {z = 0} 5 --设置Class 6 setmetatable(SubClass, Class) 7 --还是和类定义一样,索引设定为自身...--初始化对象自身 12 self = Class:new(x,y) --将对象自身设定为父类,这个语句相当于其他语言super ,可以理解调用父类构造函数 13 setmetatable...,self.z) 26 end   代码里面的注释已经很全了,关键点是通过设置SubClass父类Class,从而很方便地实现了继承,这还是归功于table查找机制。

2K20

SWIG 官方文档第四部分 - 机翻中文人肉修正

考虑到所涉及代码量,您可能还想知道为什么不直接编写一个手工制作包装器!要么是那个,要么你想知道“我到底为什么尝试包装这个可变参数函数?!?” 显然,这些是你必须自己回答问题。...然后,只有使用设置 myprojectname SWIG_TYPE_TABLE 编译模块才会共享类型信息。...它获取 Lua 状态中给定索引处值并将其转换为用户数据。然后它将提供必要类型检查,确认指针与“type”中给出类型兼容。然后最后将 '*ptr' 设置指针。...但它还向该添加了一个元,它有两个函数(__index 和 __newindex )作为以及两个(.get 和 .set)下面的 Lua 代码将展示这些隐藏功能。...然而,为了直观地使用用户数据,SWIG 还创建了一组元。正如上面关于全局变量部分所见,元使用允许直观地使用包装器。为了省力,代码每个类创建一个元将其存储在 Lua 注册中。

5.2K40

NGINX定制化 | API Management学习第四篇

NGINX特点和作用如下: HTTP和反向代理服务器 邮件和TCP / UDP代理服务器 世界上最繁忙网站提供30%能力 非阻塞,基于事件反应堆 单线程,主人+工人 模块化架构 SSL和TLS...Lua 库、第三方模块以及大多数依赖项。...,table 错误处理 - 控制返回主机 使用自动内存管理进行垃圾收集 变量 - 全局,本地, 与JavaScript非常相似,Lua就像JavaScript对象 四、代码集成方式引入3Scale(...编写自定义模块,我们需要使用继承来使用自定义代码覆盖默认APICAST_MODULE代码。 自定义模块提供了编写自定义代码推荐框架。...容器创建卷,并将其挂载到适当路径: oc set volume dc/apicast-staging --add --name=apicast-verbose --mount-path /root/

1.2K20

【游戏开发】小白学Lua——从Lua查找元素过程看元、元方法

如果说这样去理解的话,就大错特错了,实际上即使将A设置B,而且B中也确实有这个成员,返回结果仍然会是nil,原因就是B__index元方法没有赋值。...) --把sonmetatable设置father print (son.prop1) 执行输出结果仍然:nil,这正印证了上面所说,只设置是不管用。...接着Lua解释器发现son设置了元:father,(需要注意是:此时Lua并不是直接在fahter中找到名为prop1成员,而是先调用father__index方法),如果__index方法nil...Lua查找一个元素规则可以归纳如下几个步骤: Step1:在自身中查找,如果找到了就返回该元素,如果没找到则执行Step2; Step2:判断该是否有元(操作指南),如果没有元,则直接返回...nil,如果有元则继续执行Step3; Step3:判断元是否设置了有关索引失败指南(__index元方法),如果没有(__indexnil),则直接返回nil;如果有__index方法是一张

1.5K30

Lua连续教程之编写C函数技巧

lua_geti和lua_seti描述有一点令人困惑,因为其用了两个索引:index表示在栈中位置,key表示元素在位置。...标准API两种常用字符串操作提供了支持,即子串提取和字符串连接。提取子串,那么基本操作lua_pushlstring可以获取字符串长度作为额外参数。...通常情况下,我们使用注册来存储多个模块间共享数据。 注册总是位于伪索引LUA_REGISTRYINDEX中。伪索引就像是一个栈中索引,但它所关联值不在栈中。...例如,获取注册中键”key”值,可以使用如下调用: lua_getfield(L,LUA_REGISTRYINDEX,"Key"); 注册是一个普通Lua,因此可以使用除nil外任意...但是,我们可以设置不同函数上值指向一张共同,这张就成为了一个共同环境,函数在其中能够共享数据。 Lua语言提供了一个函数,该函数可以简化同一个库中所有函数间共享上值任务。

85440

Lua模块和包

通常,Lua语言不会设置规则。相反,Lua语言提供是足够强大机制供不同开发者实现最适合自己规则。然而,这种方法对于模块而言并不是特别适用。...如果加载函数有返回值,那么函数require会返回这个值,然后将其保存在package.loaded中,以便于将来在加载同一个模块时返回相同值。...如果加载函数么有返回值且package.loaded【@rep{modname}]空,函数require就假设模块返回值是true。...例如,一个静态链接到LuaC标准库可以将其luaopen函数注册到preload中,这样luaopen函数只有当用户加载这个模块时才会被调用。用这种方式,程序不会为没有用到模块浪费资源。...另一种编写模块方法是把所有的函数定义局部变量,然后在最后构造返回,参考示例 示例:使用导出模块 local function new(r,i) return {r = r, i = i

67630

关于lua一些浅析

metatable和__index可以满足。...luametatable类似于c++中虚函数,当索引table项不存在时候,进一步索引metatable(得有设置)。...,而那个已经设置中含有__metatable字段,那么在set别的元就会报错,说白了使用__metatable就是保护元,禁止用户访问元成员或者修改元,继承使用就是利用setmetatable...(A, {__index = B});,这样就相当于A已经继承了B数据 关于lua模块 在工作中每个代码最上面都会写个modole(“xxx”,package.seeall); 一开始不知道什么意思...,module函数就是把这个lua文件变成了一个模块.后面的package.seeall就是继承了全局环境_G,这样就能使用一系列系统函数了.看来几篇文章写比较详细,就不自己再细写了.给下面链接看

31440

Lua+OpenResty快速入门

特性 跟其他语言进行比较,Lua有其自身特点: (1)轻量级 Lua用标准C语言编写并以源代码形式开发,编译后仅仅一百余千字节,可以很方便嵌入到其他程序中。...但是hello.lua并不是一个可执行文件,需要通过chmod来设置可执行权限,最简单方式: chmod 755 hello.lua 然后执行该文件 ....Lua注释 关于Lua注释分两种,第一种是单行注释,第二种是多行注释。...使用Lua 语言可以以一种简单、统一且高效方式表示数组、集合、记录和其他很多数据结构。 Lua语言中本质上是一种辅助数组。...解决方案有两个:一种是下载对应模块,另一种则是禁用掉restry模块,禁用方式: http{ lua_load_resty_core off; } 测试 在nginx.conf下配置如下内容:

2K10

Lua热更新

,在后面不需要了直接将其判断空或者将判断是否调用过直接定义false也是也是可以 package.loaded["Test"]=nil -- 将判断包是否加载过为nil package.loaded...任何变量都可以作为另一个变量 任何变量都可以有自己(父亲) 当我们子表中进行一些特定操作时,会执行元内容(其中包括tostring(),index()等) 设置 设置就相比较简单了...解释: 这里很有可能会认为输出是1,因为age=1,但是他结果nil,也就是意味着空;在使用_index时需要用 _index指定,如下代码: 这里有一个小小坑:__index赋值需要放到外面赋值...(myTable9,meta9) print(getmetatable(myTable9)) 查找参数/设置参数 rawget():绕过__index,在自身身上查找有没有这个变量 meta10={...obj={} --元知识: __index 当找自己变量找不到时,就会找元当中__index指向内容 -- 这里self可以理解函数调用者 self.

3.1K10

C++调用lua 运行方式、案例亲测 及 常用API

为了解决这些问题,Lua设计者使用了虚拟栈作为二者之间数据交互介质。在C/C++程序中,如果获取Lua值,只需调用LuaC API函数,Lua就会将指定值压入栈中。...要将一个值传给Lua时,需要先将该值压入栈,然后调用LuaC API,Lua就会获取该值并将其从栈中弹出。...类型相关 API使用“索引”来引用栈中元素,第一个压入栈1,第二个2,依此类推。我们也可以使用为索引值,其中-1表示栈顶元素,-2栈顶下面的元素,同样依此类推。...void lua_settop(lua_State* L, int index); //将栈顶设置指定索引值。...void lua_replace(lua_State* L, int index); //弹出栈顶元素,并将该值设置到指定索引上。

97810

Lua连续教程之C语言API总览

其次,Lua语言会做垃圾收集:由于Lua预压引擎并不知道Lua一个可能会被保存在一个C语言变量中,因此它可能会认为这个是垃圾并将其收回。...正如第一个示例,函数luaL_loadstring将其结果留在栈中;函数lua_pcall从栈中取出调用函数,并且也会将错误消息留在栈中。 Lua严格地按照LIFO规则来操作栈。...检查栈中一个元素是否特定类型,CAPI提供了一系列名为lua_is函数,其中可以是任意一种Lua数据类型。...正确地处理应用代码中错误,就必须通过Lua语言调用我们自己代码,这样Lua语言才能设置适合上下文来捕获异常,即在setjmp上下文中运行代码。...*ud设置该分配器用户数据。

1.2K40
领券