zoukankan      html  css  js  c++  java
  • Unity热更新02-Lua基础-013-Lua元表

    print("**********元表************")
    print("**********元表概念************")
    --任何表变量都可以作为另一个表变量的元表
    --任何表变量都可以有自己的元表(爸爸)
    --当我们子表中进行一些特定操作时
    --会执行元表中的内容
    print("**********设置元表************")
    meta = {}
    myTable = {}
    --设置元表函数
    --第一个参数 子表
    --第二个参数 元表(爸爸)
    setmetatable(myTable, meta)
    
    print("**********特定操作************")
    print("**********特定操作-__tostring************")
    meta2 = {
    	--当子表要被当做字符串使用时 会默认调用这个元表中的tostring方法
    	__tostring = function(t)
    		return t.name
    	end
    }
    myTable2 = {
    	name = "Us"
    }
    --设置元表函数
    --第一个参数 子表
    --第二个参数 元表(爸爸)
    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("Unity")
    	end
    }
    myTable3 = {
    	name = "Sir"
    }
    --设置元表函数
    --第一个参数 子表
    --第二个参数 元表(爸爸)
    setmetatable(myTable3, meta3)
    --把子表当做函数使用 就会调用元表的 __call方法
    myTable3(1)
    
    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 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 true
    	end,
    	--运算符<
    	__lt = function(t1, t2)
    		return true
    	end,
    	--运算符<=
    	__le = function(t1, t2)
    		return false
    	end,
    	--运算符..
    	__concat = function(t1, t2)
    		return "567"
    	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************")
    
    meta6Father = {
    	age = 1
    }
    meta6Father.__index = meta6Father
    
    meta6 = {
    	--age = 1
    }
    --__index的赋值 写在表外面来初始化
    meta6.__index = meta6
    --meta6.__index = {age = 2}
    
    myTable6 = {}
    setmetatable(meta6, meta6Father)
    setmetatable(myTable6, meta6)
    --得到元表的方法
    print(getmetatable(myTable6))
    
    --__index 当子表中 找不到某一个属性时 
    --会到元表中 __index指定的表去找属性
    print(myTable6.age)
    --rawget 当我们使用它是 会去找自己身上有没有这个变量
    --myTable6.age = 1
    print(rawget(myTable6, "age"))
    
    --newIndex 当赋值时,如果赋值一个不存在的索引
    --那么会把这个值赋值到newindex所指的表中 不会修改自己
    meta7 = {}
    meta7.__newindex = {}
    myTable7 = {}
    setmetatable(myTable7, meta7)
    myTable7.age = 1
    print(myTable7.age)
    --rawset 该方法 会忽略newindex的设置 只会该自己的变量
    rawset(myTable7, "age", 2)
    print(myTable7.age)
    
    

  • 相关阅读:
    使用SOCKET实现TCP/IP协议的通讯
    多线程和高并发的区别
    linq学习之join
    Winform 创建桌面快捷方式并开机启动
    引领5G行业化,广和通荣获“IoT创新大奖”
    全方面的了解超宽带信号高速采集记录回放系统
    浅谈智慧灯杆的通信网建设要求
    逆向工程,调试Hello World !程序(更新中)
    融合智能将成时代方舟?中科创达技术大会向未来答疑
    第十一届蓝桥杯赛后体会和经验分享
  • 原文地址:https://www.cnblogs.com/unitysir/p/13890763.html
Copyright © 2011-2022 走看看