setmetatable(table,metatable):此方法用于为一个表设置元表。
getmetatable(table):此方法用于获取表的元表对象。
local function add_fun(self,another) local result = {} local size = #self for i=1,size do result[i] = self[i]+another[i] end return result end local function tostring_fun(self) local str = "" for i in pairs(self)do str = str..(self[i]).." " end return str end local mytable1 = {1,2,3} local mytable2 = {4,5,6} setmetatable(mytable1, {__add = add_fun}) local mytable3 = mytable1+mytable2 setmetatable(mytable3, {__tostring = tostring_fun}) print(mytable3) --假如我们想保护我们的对象使其使用者既看不到也不能修改 metatables。我们可以对 metatable 设置了__metatable 的值 setmetatable(mytable3,__metatable) print(mytable3) 5 7 9 table: 0x64f5f728
再来一段吧:
print("Lua在创建新的table时不会创建元表:") local t1={1,2,3} print(getmetatable(t1)) local t2 = {} setmetatable(t1,t2) print(getmetatable(t1)) print("重载加号运算符:") t1=setmetatable(t1,{ __add = function(mytable,newtable) local sum = 0 for k,v in pairs(mytable)do sum = sum+v end for k,v in pairs(newtable)do sum = sum+v end mytable["sum"] = sum return mytable end } ) local t3 = {4,5,6} local t4 = t1+t3 print(t4.sum) print("重载减号运算符:") local mt = {} mt.__sub=function(table1,table2) return table1["value"] - table2["value"] end --类似仿函数 mt.__call=function(f,...) print("类似仿函数:",...) end local tt1 = {value=1} local tt3 = {value=3} setmetatable(tt3,mt) print(tt3-tt1) print(tt3(6,"a")) local operator_str = [[ _add 对应的运算符 '+'. __sub 对应的运算符 '-'. __mul 对应的运算符 '*'. __div 对应的运算符 '/'. __mod 对应的运算符 '%'. __unm 对应的运算符 '-'. __concat 对应的运算符 '..'. __eq 对应的运算符 '=='. __lt 对应的运算符 '<'. __le 对应的运算符 '<='. ]] Lua在创建新的table时不会创建元表: nil table: 0x67a6f240 重载加号运算符: 21 重载减号运算符: 2 类似仿函数: 6 a