lua学习笔记15(元表的学习)

Lua 复制代码
print("*****************************元表的学习*******************************")
print("*****************************元表的概念*******************************")
--任何变量都可以作为另一个表变量的元表
--任何表变量都可以有自己的元表
--当我们对子表中进行一些特定操作的时候会执行元表中的内容
--元表相当于父类,子表相当于子类
print("*****************************设置元表*******************************")
mata={}
myTable={}
--设置元表时,第一个参数表示子表,第二个参数表示元表
setmetatable(myTable,mata)
print("*****************************特定操作*******************************")
print("*****************************特定操作 ------tostring******************************")
mata2={
	__tostring=function(t)
	  return t.name
	end
}
myTable2={
	name="赛罗",
	age=24
}
setmetatable(myTable2,mata2)
print(myTable2)--如果将return t.name注释掉就不能打印出赛罗
print("*****************************特定操作 ------call*******************************")
mata3={
	--当子表要被当做字符串使用时 会默认调用这个表中的__tostring方法
	__tostring=function(t)
	  return t.name
	end,
	--当子表被当做一个函数来执行的时候 会默认调用这个__call中的内容
	__call=function()--这里面可以添加参数,默认会将调用者传入第一个参数中
		print("你就是个笨蛋")
	end
	--__call=function(a)--这里面可以添加参数,默认会将调用者传入第一个参数中
	--	print(a)
	--	print("你就是个笨蛋")
	--end--这样写就会将小米手机打印出来
}
myTable3={
	name="小米手机",
}
setmetatable(myTable3,mata3)
myTable3()
print("*****************************特定操作 运算符重载*******************************")
mata4={
	--相当于重载运算符 当子表使用+运算符的时候 会调用该方法
	--运算符+
	__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  1
	end,
	--运算符/
	__div=function(t1,t2)
	  return  2
	end,
	--运算符%
	__mod=function(t1,t2)
	  return  3
	end,
	--运算符^
	__pow=function(t1,t2)
	  return  4
	end,
	--运算符==
	__eq=function(t1,t2)
	  return  0
	end,
	--运算符<
	__lt=function(t1,t2)
	  return  0
	end,
	--运算符<=
	__le=function(t1,t2)
	  return  0
	end,
	--运算符..
	__concat=function(t1,t2)
	  return  "连接成功"
	end,
}
myTable4={age=114514}
setmetatable(myTable4,mata4)
myTable5={age=8848}
print(myTable4+myTable5)
print(myTable4-myTable5)
print(myTable4*myTable5)
print(myTable4/myTable5)
print(myTable4%myTable5)
print(myTable4^myTable5)
--采用条件运算符来比较两个对象
--这两个对象的元表要一致才能比较
print("***********")
setmetatable(myTable5,mata4)
print(myTable4==myTable5)
print(myTable4<myTable5)
print(myTable4<=myTable5)
print(myTable4..myTable5)
print("*****************************特定操作 __index和__newindex*******************************")
mata6={
    age=10
    --mata6.__index=mata6这样写会报错
}
mata6.__index=mata6
--__index的赋值 写在表的外面来进行初始化
--mata6.__index={age=20}
myTable6={}
setmetatable(myTable6,mata6)
--当子表中找不到某一个属性的时候,会到元表中__index指定的表去找
print(myTable6.age)--如果将mata6.__index=mata6注释了过后就不会打印10
print("*********************套娃**************************")
mata666 = {
    age = 114514
}
mata666.__index = mata666 -- mata666 是它自己的元表
meta7 = {}
meta7.__index = mata666 -- 应该指向 mata666 作为它的元表的 __index
myTable7 = {}
setmetatable(myTable7, meta7) -- 现在 myTable7 的元表是 meta7,它知道如何通过 mata666 查找不存在的字段
print(myTable7.age) -- 这应该会打印出 114514
print("********************__newindex***************************")
--newindex 当赋值时,如果赋值一个不存在的索引
--那么会把这个赋值到newindex所指的表中 不会修改自己
meta8={}
meta8.__newindex={}
myTable8={}
setmetatable(myTable8,meta8)
myTable8.age=114514
print(myTable8.age)--nil
print(meta8.__newindex.age)
print("********************得到元表的方法***************************")
print(getmetatable(myTable8))
print(getmetatable(myTable6))--可以看到打印出来的table表不同
             print(setmetatable(myTable4,mata4))--这句代码的作用是将 mata4 设置为 myTable4 的元表(metatable)
--rawget 当我们使用它的时候 会去找自己身上有没有这个变量
--rawset会忽略newIndex只改变自己
print(rawget(myTable2,"age"))--24
print(rawset(myTable2,"age",100))
print(rawget(myTable2,"age"))--100--修改成功
print("这是修改失败的")
print(myTable8.age)--修改练习
print(rawset(myTable8,"age",200))--这里试图将myTable8.age修改为200
print(meta8.__newindex.age)--这里输出nil修改失败
--rawget 会忽略newIndex,只找自己
print(rawget(myTable6,"age"))--nil--找不到

输出

相关推荐
百流17 分钟前
scala文件编译相关理解
开发语言·学习·scala
雁于飞2 小时前
c语言贪吃蛇(极简版,基本能玩)
c语言·开发语言·笔记·学习·其他·课程设计·大作业
梅见十柒2 小时前
计算机系统原理:一些断言
经验分享·笔记
青椒大仙KI113 小时前
25/1/21 算法笔记<ROS2> 服务通信,参数
笔记
bohu8311 小时前
OpenCV笔记3-图像修复
笔记·opencv·图像修复·亮度增强·图片磨皮
大丈夫立于天地间11 小时前
ISIS基础知识
网络·网络协议·学习·智能路由器·信息与通信
doubt。11 小时前
【BUUCTF】[RCTF2015]EasySQL1
网络·数据库·笔记·mysql·安全·web安全
Chambor_mak12 小时前
stm32单片机个人学习笔记14(USART串口数据包)
stm32·单片机·学习
Zelotz12 小时前
线段树与矩阵
笔记