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

输出

相关推荐
懒惰才能让科技进步27 分钟前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
love_and_hope43 分钟前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习
Chef_Chen1 小时前
从0开始学习机器学习--Day14--如何优化神经网络的代价函数
神经网络·学习·机器学习
芊寻(嵌入式)1 小时前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
准橙考典1 小时前
怎么能更好的通过驾考呢?
人工智能·笔记·自动驾驶·汽车·学习方法
hong1616882 小时前
跨模态对齐与跨领域学习
学习
阿伟来咯~2 小时前
记录学习react的一些内容
javascript·学习·react.js
Suckerbin3 小时前
Hms?: 1渗透测试
学习·安全·网络安全
水豚AI课代表3 小时前
分析报告、调研报告、工作方案等的提示词
大数据·人工智能·学习·chatgpt·aigc
聪明的墨菲特i3 小时前
Python爬虫学习
爬虫·python·学习