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)




浙公网安备 33010602011771号