腳本小子_Lua元表與元方法

一、Lua元表與元方法

Lua中每種類型都有其對應的取值範圍和對應的操作方法。比如整形,只能取數字值和其操作方法: 加減乘除。但是,在操作table類型時,卻無法將兩個table相加,因爲table沒有定義相加的操作。而元表則是來補充這塊的不足。元表可以通過修改一個值得行爲,使其在面對一個非預定義的操作時,去執行一個指定的操作。比如,定義好table,相加這個操作的元表。當table a+b操作時,lua解析器就是判斷兩者之一是否有定義該操作的元表。如果找到,則執行該定義的方法。如無則提示對應的提示信息。
1、元表與元方法
從上面的說明,可以知道,元表是補充內置沒有定義的方法。但是其元表本身是k-v的類型,k只能是內置屬性描述字符,而v則只能是具體的操作方法。則該值就是所謂的"元方法",Lua中的每個值都有一個元表。table和userdata都有各自獨立的元表,而其它類型的值則共享其類型所屬的單一的元表。而lua中創建table時是不會幫其創建元表
2、setmetatable和getmetatable、__metatable
  • setmetatable設置元表,格式 setmetatable(table,table1)
  • getmetatable獲取元表,格式 getmetatable(table)
  • __metatable設置元表的元表,禁止元表設置
2.1、例子
local t = {}
print(getmetatable(t))
local t1 = {}
setmetatable(t,t1)
print(getmetatable(t) == t1)
local t = {}
setmetatable(t,{__metatable = "not to do."})
setmetatable(t,{})
3、元表類型
3.1、算術類型
屬性值
作用
__add
相加,格式 function(table1,table2)
__mul
相乘,格式 function(table1,table2)
__sub
相減,格式 function(table1,table2)
__div
相除,格式 function(table1,table2)
__unm
相反數,格式 function(table1,table2)
__mod
取模,格式 function(table1,table2)
__pow
乘冪,格式 function(table1,table2)
  
3.2、關係類型
屬性值
作用
__eq
等於,格式 function(table1,table2)
__lt
小於,格式 function(table1,table2)
__le
小於等於,格式 function(table1,table2)
備註: 關係類型中沒有其它像不等於、大於、大於等於。lua都會轉換成上述三種。
3.3、table訪問的元方法
屬性值
作用
__index
table引用索引時,調用,格式 function(table1,k)
__newindex
table對不存在的屬性賦值時,調用,格式 function(table1,k,v)
  
3.4、其它操作
屬性值
作用
__call
tabled調用一個值時,調用。格式 function(table1,table2)
__tostring
修改表的輸出行爲時,調用,格式 function(table1)
  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章