Lua: Metatable
运算符重载:
__add:
tbl = setmetatable({ 1, 2, 33 }, { __add = function(tbl, v) -- tbl 的长度不断变化, table.insert的pos参数不能使用#tbl+1, 越界会产生 position out of bounds if type(v) == 'table' then local length = #tbl for i = 1, #v do table.insert(tbl, length + i, v[i]) end else table.insert(tbl, v) end return tbl end }) jot = tbl + { 4, 55, 66 } print(table.concat(jot, ', ')) vane = tbl + 5 -- vane & jot 指向同一地址空间 print(table.concat(vane, ', '))
__call:
tbl = setmetatable({ 5 }, { __call = function(tbl, v) local sum = 0 for b = 1, #tbl do sum = sum + tbl[b] end if type(v) == 'table' then for b = 1, #v do sum = sum + v[b] end else sum = sum + v end return sum end }) print(tbl({ 6, 7 })) print(tbl(6))
__tostring:
tbl = setmetatable({ 10, 20, 30 }, { __tostring = function(tbl) local str = '' for k, v in ipairs(tbl) do str = str .. string.format('[%d] = %s, ', k, v) end return string.gsub(str, ',%s*$', '') end }) print(tbl)