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--找不到

输出

相关推荐
m0_5648768418 分钟前
提示词工程手册学习
人工智能·python·深度学习·学习
Century_Dragon19 分钟前
世纪龙-从爆炸图到原理动画:让环境感知系统在课堂上“活”起来
学习
阿荻在肝了22 分钟前
Agent学习二:智能体(Agent)开发核心原理
学习
少许极端35 分钟前
算法奇妙屋(四十)-贪心算法学习之路7
java·学习·算法·贪心算法
FakeOccupational1 小时前
【电路笔记 通信】8B_10B编码 高速数据传输的串行数据编码技术 论文流程对应实现(简化版本,仅编码数值)
笔记
忙什么果1 小时前
Mamba学习笔记2:Mamba模型
android·笔记·学习
悠哉悠哉愿意1 小时前
【物联网学习笔记】ADC
笔记·单片机·嵌入式硬件·物联网·学习
lkbhua莱克瓦242 小时前
考研数学零基础学习Day1
学习
solicitous2 小时前
遇到一个口头机遇的答辩准备3(ai告诉的要点)
学习·生活
CheerWWW2 小时前
C++学习笔记——this关键字、对象生命周期(栈作用域)、智能指针、复制与拷贝构造函数
c++·笔记·学习