首页 > 其他分享 >Lua 语法 元表

Lua 语法 元表

时间:2024-07-28 21:17:28浏览次数:15  
标签:__ 元表 -- age t2 t1 语法 Lua

元表概念

-- 任何 表变量 都可以作为另一个表变量的元表
-- 任何 表变量 都可以有自己的元表(继承(浅拷贝))
-- 当我们子表中进行一些特定操作时
-- 会执行元表中的内容

设置元表

设置元表的公共方法
setmetatable(被设置的表,元表)
getmetatable 得到元表,判断是否有元表

meta ={}
myTable={}
--设置元表函数
--第一个参数 需要被设置的表
--第二个参数 元表(继承)
setmetatable(myTable,meta)
-- 得到元表的方法 --可以判断是否有元表
print(getmetatable(myTable))

关于元表——元方法

特定操作-__tostring
meta2 ={
	-- 当子表要被当做字符串使用时 会默认调用这个元表中的__tostring方法 
	__tostring = function ( t )
		return "洛溪"..t.name
	end
}
myTable2={
	name = "欢迎光临"
}
--设置元表函数
--第一个参数 子表
--第二个参数 元表(继承)
setmetatable(myTable2,meta2)

print(myTable2)
特定操作-__call
meta3 ={
	-- 当子表要被当做字符串使用时 会默认调用这个元表中的__tostring方法 两个下滑——不是一个
	__tostring = function ( t )
		return "洛溪"..t.name
	end,
	-- 当把自己当函数调用时 默认第一个参数 是调用着自己
	__call =function(t,t2)
		--当子表被当作一个函数来使用时 会默认调用这个_call中的内容
		print("白芷,欢迎回归",t,t2)
	end
}

myTable3={
	name = "欢迎光临"
}
--设置元表函数
--第一个参数 子表
--第二个参数 元表(继承)
setmetatable(myTable3,meta3)
--把子表当作函数使用 就会调用元表的__call方法
myTable3(1)
特定操作-运算符重载
meta4 ={
	-- 相当于 运算符重载 当子表使用 + 运算符 会调用该方法
	-- 运算符+
	__add = function(t1,t2)
		return t1.age+t2.age
	end,
	-- 运算符-
	__sub = function(t1,t2)
		return t1.age-t2.age
	end,

	-- 运算符*
	__mul = function(t1,t2)
		return t1.age*t2.age
	end,

	-- 运算符/
	__div = function(t1,t2)
		return t1.age/t2.age
	end,

	-- 运算符%
	__mod = function(t1,t2)
		return t1.age%t2.age
	end,

	-- 运算符^
	__pow = function(t1,t2)
		return t1.age^t2.age
	end,

	-- 运算符==
	__eq = function(t1,t2)
		return t1.age==t2.age
	end,

	-- 运算符<
	__lt = function(t1,t2)
		return t1.age<t2.age
	end,

	-- 运算符<=
	__le = function(t1,t2)
		return t1.age<=t2.age
	end,

	-- 运算符 ..
	__concat = function(t1,t2)
		return t1.age..t2.age
	end,
}
mytable4= { age=3 }
setmetatable(mytable4,meta4)

mytable5 ={ age=3 }

setmetatable(mytable5,meta4)

print(mytable4 + mytable5)
print(mytable4 - mytable5)
print(mytable4 * mytable5)
print(mytable4 / mytable5)
print(mytable4 % mytable5)
print(mytable4 ^ mytable5)

-- 如果要用条件运算符 来比较两个对象
-- 这两个对象的元表一定要一致 才能准确调用方法
print(mytable4 == mytable5)
print(mytable4 < mytable5)
print(mytable4 <= mytable5)

print(mytable4 .. mytable5)
特定操作-_index和_newIndex
meta6Father ={
	age = 9
}

meta6Father.__index=meta6Father

meta6 ={
	--age=1,
	-- 第三种赋值 (不推荐使用)
	--__index={age=6}
}

-- __index的赋值 写在表外面来初始化
-- 第一种修改
meta6.__index = meta6

-- 第二种修改
--meta6.__index = {age=3}


myTable6={}
setmetatable(meta6,meta6Father)

setmetatable(myTable6,meta6)

--__index 当子表中 找不到某一个属性时
--会到元表中 __index 指定的表去找属性 _index 一般会指向一个表
-- 如果_index 的表中也没有找到 会往上 也就是__index指向的元表的元表的__index中去找
-- 完全找不到 返回nil

print(myTable6.age)

-- rawget 当我们使用它时 只会去找自己身上有没有这个变量
print(rawget(myTable6 , "age"))

--newIndex 当赋值时,如果赋值一个不存在的索引
--那么会把这个值赋值到newindex所指的表中 不会修改自己

meta7 ={}

meta7.__newindex ={}

myTable7 ={}

setmetatable(myTable7,meta7)

myTable7.age=1

print(myTable7.age)
-- 注意要从元表的__newindex 来找值不能从子表
--print(meta7.__newindex.age)

--rawset 该方法 会忽略newindex的设置 只会改自己的变量
rawset(myTable7,"age",2)

print(myTable7.age)

更详细的介绍
https://www.cnblogs.com/blueberryzzz/p/8947446.html

标签:__,元表,--,age,t2,t1,语法,Lua
From: https://www.cnblogs.com/Luo-Xi/p/18328880

相关文章

  • Lua 语法 协同程序
    协程的创建lua协程的类型是thread(线程)协程的本质是一个线程对象关键字:coroutine.create--创建协程fun=function()print(123)end--第一种协程创建方式co=coroutine.create(fun)--协程的本质是一个线程对象--输出类型:地址print(co)--输出threadprint(ty......
  • Android.mk语法规则(主要针对C编译)
    参考页面:https://www.jb51.net/program/29533325i.htmhttps://www.cnblogs.com/kn-zheng/p/17005182.htmlAndroid.mk是什么Android.mk是Android工程管理文件,类似于编译文件的说明书,用来向NDK编译系统描述源代码,并将源文件分组为模块(包括静态库、共享库、独立可执行文件)。And......
  • Lua 语法 复杂类型表 字典 , 类,结构体,表的公共操作
    字典字典的本质运用键值对一个键对应一个值和自定义索引表相似定义使用--字典是由键值对构成a={["name"]="洛溪",["age"]=14,["1"]=10}--访问单个变量用中括号填键来访问print(a["name"])print(a["1"])print(a["age"])--还可以类似成员变量的形式得......
  • lua可变参数
    遍历可变参数localfunctionTest1(...)localargCnt=select("#",...)fori=1,argCntdolocalitem=select(i,...)print(i,item)endendTest1(4,5,6) 遍历可变参数方式2localfunctionTest2(...)localargs={...}......
  • 当 Visual Studio 检测到代码没有问题时,无法弄清楚为什么它返回“语法错误”
    fromkivy.appimportAppfromkivy.uix.gridlayoutimportGridLayoutfromkivy.uix.labelimportLabelclasstest(App):defbuild(self):self.window=GridLayout()self.label=Label(text="hello")self.window.add_widge......
  • Lua 语法之迭代器
    迭代器主要是用来遍历表的两个迭代器区别#ipairspairs索引必须数字且连续索引必须数字且连续索引可以随意从1开始到nil从1开始到nil从1开始到无其他索引字符索引不识别字符索引不识别字符索引识别关键字ipairs--#得到长度其实并不准确一般不......
  • python基本语法三天速成系列day1(看完这篇你就会)
    注释注释是代码非常重要的一部分,它的主要作用有:解释代码目的:注释可以说明代码段或函数的目的和功能,帮助其他开发者快速理解代码的意图。复杂逻辑说明:对于复杂的算法或业务逻辑,通过注释可以解释这些逻辑是如何工作的,降低后续维护的难度。提高可读性:良好的注释可以使代码结......
  • Lua 语法_复杂类型表____数组与二维数组
    复杂数据类型Lua所有的复杂类型都是table(表)数组如何用Luatable(表)实现数组--lua表中没有具体的限制可以是数值,字符串,布尔值a={1,2,3,4,"洛溪",true,nil}--Lua中默认索引从1开始0如果没有自定义索引则为空nilprint(a[0])--#号时用的获取长度的关键字--......
  • Python 教程(二):语法与数据结构
    目录前言专栏列表语法特点实例代码基本数据类型变量命名规则赋值动态类型作用域示例代码运算符`list`、`set`和`dict`数据结构区别1.list(列表)2.set(集合)3.dict(字典)总结前言Python是一种计算机编程语言。每种编程语言都有自己的语法规则。在本教程中,我们将学......
  • java 基本语法3
    1.方法的定义格式如:publicstaticvoidadd(intx,inty){returnx+y;}java的方法感觉就是c中的函数,子例程。但java是一个面向对象的语言,它的每一个方法都在类中,其中由于主方法的格式:publicstaticvoidmain(String[]args){},所以他只能调用静态的成员,所以在方法中也应该用......