Lua-7-元表

元表概念:任何表变量都可以作为另一个表变量的原表,并且任何表变量都可以有自己元表(爸爸)。当我们子表中进行一些特点操作时,会执行元表中的内容。

设置元表

setmetatable(1,2)第一个参数 子表,第二个参数 元表(爸爸)

print("************设置元表************")
meta = {}
myTable = {}
--设置元表函数
--第一个参数 子表
--第二个参数 元表(爸爸)
setmetatable(myTable,meta)

特点操作

特点操作-__tostring

当子表要被当作字符串使用时 会默认调用这个元表中的__tostring方法

情况一:元表内无__tostring函数。会打印出myTable2的类型和地址

print("************特点操作-_tostring************")
meta2 = {
		
}
myTable2= { 
	name ="唐老师2"
}
setmetatable(myTable2,meta2)
print(myTable2)
-------------------
************特点操作-_tostring************
table: 00A69968

情况二:元表内有__tostring函数。执行了元表中的内容,返回裔裔裔。

print("************特点操作-_tostring************")
meta2 = {
	--当子表要被当作字符串使用时 会默认调用这个元表中的__tostring方法
	__tostring = function ()
		return "裔裔裔"
	end	
}

myTable2= { 
	name ="裔哥2"
}
--设置元表函数
--第一个参数 子表
--第二个参数 元表(爸爸)
setmetatable(myTable2,meta2)

print(myTable2)
------------------------------
************特点操作-_tostring************
裔裔裔

情况三:元表内有__tostring函数,且有参数。返回的是裔哥2,这意味着如果__tostring有参数,当我们打印这个子表的时候,那么子表会默认把自己传递到元表的__tostring(t)方法中。

print("************特点操作-_tostring************")
meta2 = {
	--当子表要被当作字符串使用时 会默认调用这个元表中的__tostring方法
	__tostring = function (t)
		return t.name
	end	
}

myTable2= { 
	name ="裔哥2"
}
--设置元表函数
--第一个参数 子表
--第二个参数 元表(爸爸)
setmetatable(myTable2,meta2)

print(myTable2)
--------------------------------
************特点操作-_tostring************
裔哥2

特点操作-_call

当子表被当作函数来使用时 会默认调用这个__call中的内容,并且和__tostring一样,当当希望传递参数时,默认第一个参数时调用者自己

print("************特点操作-_call************")

meta3 = {
	__tostring = function (t)
		return t.name
	end,
	--当子表被当作函数来使用时 会默认调用这个__call中的内容
	--当希望传递参数时,默认第一个参数 时调用者自己
	__call = function(a,b)
		print(a)
		print(b)
		print("拉拉啊")
	end	
}

myTable3= { 
	name ="唐老师3"
}
setmetatable(myTable3,meta3)
--把子表当作函数使用 就会调用元表的__call方法
myTable3(1)
---------------------------------------------
************特点操作-_call************
唐老师3
1
拉拉啊

特点操作-运算符重载

print("************特点操作-运算符重载************")
meta4 = {
	--相当于运算符重载 当子表使用+运算符时 会调用该方法
	--运算符 +
	__add = function (t1,t2)
		-- body
		return t1.age + t2.age
	end,
	--运算符 -
	__sub = function (t1,t2)
		-- body
		return t1.age - t2.age
	end,
	--运算符 *
	__mul = function (t1,t2)
		-- body
		return t1.age * t2.age
	end,
	--运算符 /
	__div = function (t1,t2)
		-- body
		return t1.age / t2.age
	end,
	--运算符 %
	__mod = function (t1,t2)
		-- body
		return t1.age % t2.age
	end,
	--运算符^
	__add = function (t1,t2)
		-- body
		return t1.age ^ t2.age
	end,
	--运算符 == 
	__eq = function (t1,t2)
		-- body
		return 0
	end,
	--运算符 < 
	__lt = function (t1,t2)
		-- body
		return 0
	end,
	--运算符 <= 
	__le = function (t1,t2)
		-- body
		return 0
	end,
	--运算符 .. 
	__concat = function (t1,t2)
		-- body
		return 0
	end

}
myTable4 = {age = 1}
setmetatable(myTable4,meta4)
myTable5 = {age = 2}

print(myTable4+myTable5)
print(myTable4-myTable5)

 特点操作-__index和__newIndex(重要)

__index 当子表中 找不到某一个属性时会到元表在 __index指定的表去找索引

meta6Father = {
	age = 1
}

meta6Father.__index = meta6Father

meta6 = {
 
}

meta6.__index = meta6
myTable6 = { }

setmetatable(meta6,meta6Father)
setmetatable(myTable6,meta6)
print(myTable6.age)
--------------------------------
1

我们需要打印myTable6的age,但是myTable6没有,因此去它的元表的__index指定的表去找。也就是meta6,然而meta6.__index = meta6。它的__index指向自己因此找meta6的age。找不到,找meta6的元表__index.就是meta6Father.__index = meta6Father,指向meta6Father自己,得到meta6Father.age = 1。输出1

--得到元表的方法
print(getmetatable(myTable6))
------------------
table: 00A713B8
--当我们使用他时 会去找自己身上有没有这个变量
rawget(myTable6,"age")
print(rawget(myTable6,"age"))
---------------------------------
nil
nil

newIndex:当赋值时,如果赋值一个不存在的索引那么会把这个值赋值到newindex所指的表中 不会修改自己

--newIndex 当赋值时,如果赋值一个不存在的索引
--那么会把这个值赋值到元表的newindex所指的表中 不会修改自己
print("************__newindex**********")
meta7 = { }
meta7.__newindex = { }
myTable7 = { }
setmetatable(myTable7,meta7)
myTable7.age = 1
print(myTable7.age)
print(meta7.__newindex.age)
--rawset 该方法 会忽略newindex的设置 只会改自己的变量
rawset(myTable7,"age",2)
print(myTable7.age)
-------------------------------------------
************__newindex**********
nil
1
2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值