Lua学习--------元表

***********元表************")
print("************元表的概念************")
--任何表变量都可以作为另一个表变量的元表
--任何表变量都可以有自己的元表
--当我们子表中进行一些特定操作时
--会执行元表中的内容

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

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

myTable2 = {
	name = "米老鼠"
}

setmetatable(myTable2,meta2)
print(myTable2)

print("************特定操作-__call************")
meta3 = {
	--当子表要被当做字符串使用时 会默认调用这个元表中的tostring放法
	__tostring = function (T)
		return T.name
	end,
	--当子表被当做一个函数来调用时 会默认调用这个__call中的内容
	--当希望传参数时 一定要记住 默认第一个参数 是子表自己也就是调用者自己
	__call = function (a,b)
		print(a)
		print(b)
		print("我是高斯")
	end
}

myTable3 = {
	name = "米老鼠"
}

setmetatable(myTable3,meta3)

--把子表当做函数使用 就会调用元表的__call放法
myTable3()
myTable3(1)
myTable3(1,2)

print("************特定操作-运算符重载************")
meta4 = {
	--相当于运算符重载 当子表使用+运算符时 会调用该放法
	--运算符
	__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 t1.age * t2.age
	end,
	--运算符/
	__div= function (t1,t2)
		return t1.age / t2.age
	end,
	--运算符%
	__mod= function (t1,t2)
		return t1.age % t2.age
	end,
	--运算符^
	__pow= function (t1,t2)
		return t1.age ^ t2.age
	end,
	--运算符==
	__eq= function (t1,t2)
		if t1.age == t2.age then
			return true
		end
	end,
	--运算符<
	__lt= function (t1,t2)
		if t1.age < t2.age then
			return true
		end
	end,
	--运算符<=
	__le = function (t1,t2)
		if t1.age <= t2.age then
			return true
		end
	end,
	--运算符..
	__concat = function (t1,t2)
		return t1.age .. t2.age
	end
}
myTable4 = {age = 1}

setmetatable(myTable4,meta4)
myTable5 = {age = 2}
setmetatable(myTable5,meta4)
print(myTable4 + myTable5)
print(myTable4 - myTable5)
print(myTable4 * myTable5)
print(myTable4 / myTable5)
print(myTable4 % myTable5)
print(myTable4 ^ myTable5)

--如果要用条件运算符来比较大小 那么这两个对象的元表一定要一致 才能准确调用党放法
print(myTable4 == myTable5)
print(myTable4 < myTable5)
print(myTable4 <= myTable5)

print(myTable4 .. myTable5 )

print("************特定操作-_index和_newIndex************")

meta6 = {
	--__index = {age = 1}
	age = 1
}


--__index的赋值 写在外面来初始化
meta6.__index = meta6
myTable6 = {}
setmetatable(myTable6,meta6)
--getmetatable输出自己的元表
print(getmetatable(myTable6))
--__index 当子表中 找不到某一种属性时
--会到元表中 __index指定的表去找索引

print(myTable6.age)
-- rawget当我们使用它时 会去找自己身上有没有这个变量
print(rawget(myTable6,"age"))
--newIndex当赋值时 如果赋值一个不存在的索引
--那么会把这个值赋值到newindex所指的表中 不会修改自己

meta7 = {}
meta7.__newindex= {}
myTable7 = {}
setmetatable(myTable7,meta7)
myTable7.age = 8
print("__newindex",myTable7.age)
print(meta7.__newindex.age)
--rawset 该放法 会忽略newindex的设置 只会改自己的变量
rawset(myTable7,"age",5)
print("__newindex",myTable7.age)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值