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

输出

相关推荐
天天爱吃肉821831 分钟前
第十篇:电源设计的“能量矩阵”——无线充电与碳化硅LLC谐振
笔记·矩阵·汽车
王小义笔记37 分钟前
Postman如何流畅使用DeepSeek
开发语言·测试工具·lua·postman·deepseek
Luis Li 的猫猫1 小时前
深度学习中的知识蒸馏
人工智能·经验分享·深度学习·学习·算法
鹿鸣悠悠4 小时前
第二月:学习 NumPy、Pandas 和 Matplotlib 是数据分析和科学计算的基础
学习·numpy·pandas
Java能学吗5 小时前
2.17学习总结
数据结构·学习
靡不有初1116 小时前
CCF-CSP第31次认证第二题——坐标变换(其二)【NA!前缀和思想的细节,输出为0的常见原因】
c++·学习·ccfcsp
我爱学习_zwj9 小时前
4.从零开始学会Vue--{{组件通信}}
前端·javascript·vue.js·笔记·前端框架
虾球xz9 小时前
游戏引擎学习第108天
学习·游戏引擎
好评笔记9 小时前
深度学习笔记——循环神经网络之LSTM
笔记·rnn·深度学习
初尘屿风10 小时前
小程序类毕业设计选题题目推荐 (29)
spring boot·后端·学习·微信·小程序·课程设计