基础概念

news/2024/10/18 11:10:26/文章来源:https://www.cnblogs.com/comradexiao/p/18473856

LUA类的实现

Lua中的table是一个对象。拥有状态,拥有self,拥有独立于创建者和创建地的生命周期。

一个类就是一个创建对象的模具。Lua没有类的概念,但可以模拟类。

元表和元方法和模拟类有关,Lua 本身是函数式的语言,但借助 metatable (元表)这个强大的工具,Lua 实现操作符重载易如反掌。就像两个表相加,只要我们在元表中写上 __add 方法就可以实现了。

meta={__add=function(op1,op2)op = {}op.x = op1.x + op2.xop.y = op1.y + op2.yreturn opend
}
a={x=1,y=1}
setmetatable(a,meta)
b={x=3,y=4}
c = a + b
print(c.x, c.y) -- 输出 4,5 建立自己的类

通过这个方法,可以定义“类”的构造函数,析构函数。

除了与操作符重载有关的元方法以外,要建立自己的类,就不得不认识另外一个元方法 “__ index”。当表格搜寻成员未果的时候,Lua 会触发它,__ index 所指向的元方法,元方法所返回的结果就成为了搜寻结果。如果没有这个元方法,那么访问结果为 nil。__index元方法还可以直接为一张表。

假设要创建一些描述窗口的table,每个table中必须描述一些窗口参数,例如位置、大小及主题颜色等。所有这些参数都有默认值,因此希望在创建窗口对象时可以仅指定那些不同于默认值的参数。我们让新窗口从一个原型窗口处继承所有不存在的字段。首先,声明一个原型和一个构造函数,构造函数创建新的窗口,并使它们共享一个元表:

Window = {} --创建一个名字空间
--使用默认值来创建一个原型
Window.prototype = {x=0,y=0,width=100,height=100}
Window.mt = {} --创建元表
--声明构造函数
function Window.new(o)setmetatable(o,Window.mt)return o
end
定义__index元方法:
Window.mt.__index = function(table,key)return Window.prototype[key]
end

在这段代码之后,创建一个新窗口,并查询一个它没有的字段:

w = Window.new{x=10,y=20}
print(w.width) -->100

若Lua检测到w中没有某字段,但在其元表中却有一个__index字段,那么Lua就会以w(table)和"width"(不存在的key)来调用这个__index元方法。随后元方法用这个key来索引原型table,并返回结果。
在Lua中,将__index元方法用于继承是很普遍的方法,因此Lua还提供了一种更便捷的方式来实现此功能。__index元方法不必一定是一个函数,它还可以是一个table。当它是一个函数时,Lua以table和不存在的key作为参数来调用该函数,这就如同上述内容。而当它是一个table时,Lua就以相同的方式来重新访问这个table。因此,前例中__index的声明可以写为:

Window.mt.__index = Window.prototype
现在可以写一个简历的类:
A = {x=0,y=0}
--这句是重定义元表的索引,必须要有,
A.__index = A--模拟构造体,一般名称为new()
function A:new(x,y)local self = {}setmetatable(self, A)   --必须要有self.x = xself.y = yreturn self
endfunction A:test()print(self.x,self.y)
endobjA = A:new(1,2)
objA:test()
print(objA.x,objA.y)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/816764.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GCM

GaloisCounter Mode (GCM) 运算符与函数$0^s$包含了$s$个$0$的比特串。$\mbox{CIPH}_K⁡(X)$在密钥$K$下对分组$X$应用分组密码得到的输出。$\mbox{GCTR}_K⁡(ICB,X)$在密钥K下对包含初始组计数$ICB$的比特串X应用包含给定分组加密的 $\mbox{GCTR}$函数的输出。$\mbox{GHASH}_H…

音频压缩

声音压缩 压缩音频在微信上的播放效果结论:在Pc环境测试后,压缩音频在微信环境中也拥有相同表现。 码率对音质的影响设置总结 将码率设置为64k和原版几乎没有差别,压缩率35% 将码率设置到48k,仔细可以听出些许差别,在对音频要求不高的地方可以使用。 转码率工具 https://w…

创新突破!天翼云荣膺CCF HPC China 2024高性能计算创新大奖

近日,第20届CCF全国高性能计算学术年会(CCF HPC China 2024)在武汉隆重召开。CCF HPC China是全球高性能计算领域三大标志性盛会之一,本届大会以“华章廿载 新质未来”为主题,由12位院士领衔,携手来自算力领域的400多位顶尖学者,进行学术交流和专题分享。近日,第20届CC…

汽车零部件行业CRM应用数字化解决方案解析

1.行业背景与挑战分析 近年来,随着国家对新能源汽车行业的大力支持,国内汽车产业不仅在国内市场实现了弯道超车,而且新能源汽车的海外出口也开拓了新的市场,为自主品牌的新能源战略贡献了新的增长点;这一迅猛发展的趋势也带动了汽车零部件行业的增长。 同时,汽车零部件行…

gjoi 10.18

模拟赛不通知,模拟赛巨大绑包,素质有待降低。T1 向量 不难发现操作次数固定,操作其实相当于在有两位的前提下减少一位,如果和 \(\geq 10\) 花费 \(9\) 的代价加 \(1\) 位。答案肯定是 \(初始位数+额外位数-1\),现在问题是额外位数是什么,不妨设序列和为 \(sum\),额外次数…

Leetcode 721. 账户合并

1.题目基本信息 1.1.题目描述 给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails 表示该账户的邮箱地址。 现在,我们想合并这些账户。如果两个账户都有一些共同的邮箱地址,则两个账户必定属于…

网管平台(基础篇):网管系统的重要性

网管系统的核心地位:数字世界的稳定舵手 在信息技术日新月异的今天,网络如同一条无形的纽带,将世界紧密相连。然而,这条纽带背后隐藏着无数复杂的节点与链路,如何确保它们高效、稳定地运行,成为了一个亟待解决的问题。网管系统,作为数字世界的稳定舵手,以其强大的监控与…

揭秘!如何设计高可用、高性能、高扩展的异地多活系统?【转】

1 关于基础架构 2 关于异地多活 3 写时延是关键 4 写量大拆分片 5 做隔离拆分片 6 其他影响因素 7 数据复制架构 8 数据影响路由 9 架构选型模式异地多活是分布式系统架构设计的一座高峰,当业务系统走到需要考虑异地多活这一步,其体量和复杂度都会达到很高的水准。接入层、逻…

引擎模块自身占用

引擎自身中存在内存开销的部分纷繁复杂,可以说是由巨量的“微小”内存所累积起来的,比如GameObject及其各种Component(最大量的Component应该算是Transform了)、ParticleSystem、MonoScript以及各种各样的模块Manager(SceneManager、CanvasManager、PersistentManager等)……

怎样修改网站ftp密码?

修改网站FTP密码的方法取决于你使用的FTP服务提供商或Web主机控制面板。以下是一些常见情况下的步骤:通过cPanel修改FTP密码:登录到你的cPanel账户。 在文件部分找到“FTP账户”选项并点击。 选择你想要修改密码的FTP账户。 点击“更改密码”按钮。 输入新密码,并确认。 点击…

CMDB平台(基础篇):CMDB的概念以及现状

CMDB:IT界的“超级大脑”,现状却让人哭笑不得 在IT界,有一个神秘而强大的存在,它被称为CMDB——资产配置管理。听起来就像是《复仇者联盟》里的超级英雄,但实际上,它更像是IT界的“超级大脑”,默默记录着每一个IT组件的“身世”和“关系网”。 那CMDB到底是什么呢?下面…