LUA-----元表

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

print("*******设置元表********")
meta={
    
    }
myTable={
    
    }
--设置元表函数 (子表,元表)
setmetatable(myTable,meta)



print("*******特定操作********")
print("*******特定操作-_tostring********")

meta2={
    
    
	--当子表要被当做字符串使用时 会默认调用这个元表中的tostring方法
	__tostring=function ( t)
		-- body
		return t.name
	end,
}
myTable2={
    
    
	name="小明"

}
setmetatable(myTable2,meta2)
print(myTable2)



print("*******特定操作-_call********")
meta3={
    
    
	--当子表要被当做字符串使用时 会默认调用这个元表中的tostring方法
	__tostring=function ( t)
		-- body
		return t.name
	end,
	--作为函数使用时 调用call方法

	__call = function(a,b)
	    print(a)
	    print(b)
		print("小明23333")
	end


}
myTable3={
    
    
	name="小明"

}
setmetatable(myTable3,meta3)
myTable3() --必须有元表才能这样调用

myTable3(1) --要打印出这个1,call方法里要有两个参数,因为第一个参数默认是自己


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,
	--运算符^
	__pow = function ( t1,t2 )
		-- body
		return t1.age^t2.age
	end,
	--运算符==
	__eq = function ( t1,t2 )
		-- body
		return t1.age==t2.age
	end,
	--运算符<
	__lt = function ( t1,t2 )
		-- body
		return t1.age<t2.age
	end,
	--运算符<=
	__le = function ( t1,t2 )
		-- body
		return t1.age<=t2.age
	end,
	--运算符..
	__concat = function ( t1,t2 )
		-- body
		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("*******特定操作-_index和_newIndex********")
--重要

meta6={
    
    

	--age=1
	--方法三
	--__index={age=2}
}
--__index最好还是在外面,不然可能会出问题
--方法一
--meta6.__index=meta6
--方法二
meta6.__index={
    
    age=2}
myTable6={
    
    }

setmetatable(myTable6,meta6)
--得到元表的方法
print(getmetatable(myTable6))




--__index
--当子表中找不到某一个属性时,会到元表中__index指定的表去找索引
print(myTable6.age) --没有meta6.__index=meta6的话会得到空,因为没有指定
--当使用rawget时,会去自己身上找有没有这个变量
print(rawget(myTable6,"age"))




--newIndex 
--当赋值时 如果赋值一个不存在的索引 会把这个值赋值给newIndex所指向的表中 不会修改自己
meta7={
    
    }
meta7.__newindex={
    
    }
myTable7={
    
    }
setmetatable(myTable7,meta7)
myTable7.age=1 --这个age被放到了新表中
print(myTable7.age)
--该方法会忽略newIndex直接给自身添加
rawset(myTable7,"age",2)
print(myTable7.age)






猜你喜欢

转载自blog.csdn.net/memory_MM_forever/article/details/113871082
今日推荐