首页 > 其他分享 >基础概念

基础概念

时间:2024-10-18 10:59:05浏览次数:6  
标签:__ index Lua -- 基础 概念 Window table

LUA类的实现

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

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

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

meta={
	__add=function(op1,op2)
		op = {}
		op.x = op1.x + op2.x
		op.y = op1.y + op2.y
		return op
	end
}
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 = x
        self.y = y
        return self
end

function A:test()
    print(self.x,self.y)
end

objA = A:new(1,2)
objA:test()
print(objA.x,objA.y)

标签:__,index,Lua,--,基础,概念,Window,table
From: https://www.cnblogs.com/comradexiao/p/18473856

相关文章

  • 1.docker基础课程-docker安装
    如今,docker的使用已是越来越广泛熟练的掌握docker的使用已经是作为后端开发工程师必不可少的技能之一了docker是干啥的我们都知道,windows环境和linux环境是不一样的简单来说就是,不同的应用程序所依赖的环境不一样,如果把他们依赖的软件都安装在一个服务器上,不仅需要调试很久......
  • 网管平台(基础篇):网管系统的重要性
    网管系统的核心地位:数字世界的稳定舵手在信息技术日新月异的今天,网络如同一条无形的纽带,将世界紧密相连。然而,这条纽带背后隐藏着无数复杂的节点与链路,如何确保它们高效、稳定地运行,成为了一个亟待解决的问题。网管系统,作为数字世界的稳定舵手,以其强大的监控与管理能力,成为了维护......
  • 类与对象基础练习_学生登记
    要求定义一个Student类,包含以下要求:实例字段:name(名字),age(年龄),id(学生编号,自动生成,从1000开始)静态字段:studentCount(静态变量,用于统计总学生数),nextId(下一个学生编号)构造器:接受名字和年龄作为参数,在构造器中应进行总学生数的统计,并为学生分配唯一的id实例方法:introduce(),当调用该......
  • CMDB平台(基础篇):CMDB的概念以及现状
    CMDB:IT界的“超级大脑”,现状却让人哭笑不得在IT界,有一个神秘而强大的存在,它被称为CMDB——资产配置管理。听起来就像是《复仇者联盟》里的超级英雄,但实际上,它更像是IT界的“超级大脑”,默默记录着每一个IT组件的“身世”和“关系网”。 那CMDB到底是什么呢?下面我们就聊一聊CM......
  • MySQL基础函数的学习要点和步骤
    MySQL基础函数的学习要点和步骤可以归纳为以下几个方面:学习要点1.函数的概念:  -函数是一段可以直接被另一段程序调用的程序或代码。2.分类理解:  -字符串函数:如`CONCAT()`,`LOWER()`,`UPPER()`,`LPAD()`,`RPAD()`,`TRIM()`,`SUBSTRING()`等,用于处理字符串......
  • 二维 bfs 基础笔记
    一、寻找连通块1.基本思路找到一个未被走过的点,以这个点为起点,将与此点相连的所有点标记为走过,答案数\(+1\)2.代码实现#include<bits/stdc++.h>usingnamespacestd;structp{intx,y;};queue<p>q;intn,m,cnt;//最终答案为cntintdx[]={1,-1,0,0}......
  • Spring基础
    一、什么是Spring框架?Spring是一款开源的轻量级Java开发框架,旨在提高开发人员的开发效率以及系统的可维护性。我们一般说Spring框架指的都是SpringFramework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发,比如说Spring支持IoC(InversionofContr......
  • Python基础知识总结
    变量#变量定义name="name"age=18height=1.75#多个变量赋值a=b=c=1print(a,b,c)字符串#字符串定义及输出str1="hello"str2='world'print(str1,str2)#字符串格式化输出print("name:%s,age:%d,height:%.2f"%(name,age,height))#字符串拼接str3=str1+str2pri......
  • (八千字心得笔记)零基础C语言入门第一课——初识C语言
    这一课主要是让大家初步了解C语言,了解我们的开发环境,main函数,库函数,关键字,字符和字符串等内容的介绍,后面会一一讲解文章目录一.C语言是什么1.1C语言的历史二.开发环境编译型语言和解释型语言2.1编译和链接2.2编译器的选择2.2.1VS项目和源文件、头文件介绍2.2.2......
  • 学习groovy基础
    简介Groovy是一种JVM语言,它可以编译与Java相同的字节码,然后将字节码文件交给JVM去执行,并且可以与Java无缝地互操作,Groovy可以透明地与Java库和代码交互,可以使用Java所有的库。Groovy也可以直接将源文件解释执行它还极大地清理了Java中许多冗长的代码格式如果......