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

输出

相关推荐
云深处@8 小时前
【数据库】MySQL 入门
数据库·学习·mysql
果果燕8 小时前
实习笔记(一):NFS、Samba、VNC、Git、CMake、systemd、内核、交叉编译
linux·arm开发·c++·笔记·git
HyperAI超神经9 小时前
【vLLM 学习】Disaggregated Prefill
人工智能·深度学习·学习·vllm
天吾cc9 小时前
RTT-IO设备模型
单片机·嵌入式硬件·学习
美味蛋炒饭.9 小时前
Git 版本控制(下)
开发语言·git·学习·总结·后端开发
呼噜想睡觉9 小时前
Bootstrap 组件之响应式导航条实现
学习
菜鸟‍10 小时前
【论文学习】Medical Image Analysis 2024 || 医学图像分割中失败检测方法的比较基准研究:揭示置信度聚合的作用
人工智能·学习
Zguigo10 小时前
第25-26讲:计算机操作系统存储管理——分页机制、页表与快表(TLB)
linux·windows·笔记
爱音乐的marlon11 小时前
FastAPI 学习笔记03|core 核心层:config 是总控制台,database 是整个工程的地基
笔记·学习·fastapi
math_hongfan12 小时前
鸿蒙离线数据缓存高级架构:弱网预加载/离线数据优先级/同步冲突解决/上线后数据合并策略
学习·缓存·华为·架构·harmonyos·鸿蒙