Lua 提供了元表(Metatable),允许我们改变 table 的行为,每个行为关联了对应的元方法。
步骤
实例
mytable = setmetatable({key1 = "value1"}, {__index = function(mytable, key)if key == "key2" thenreturn "metatablevalue"elsereturn nilendend
})print(mytable.key1,mytable.key2)
Output
value1 metatablevalue
实例解析
步骤
在对新索引键赋值时,会调用元方法,而不进行赋值。而如果对已存在的索引键,则会进行赋值,而不调用元方法 __newindex。
实例
mytable = setmetatable({key1 = "value1"}, {__newindex = function(mytable, key, value)rawset(mytable, key, "\""..value.."\"")end
})mytable.key1 = "new value"
mytable.key2 = 4print(mytable.key1,mytable.key2)
output
new value “4”
function table_maxn(t)local mn = 0for k, v in pairs(t) doif mn < k thenmn = kendendreturn mn
endmytable = setmetatable({10}, {__call = function(mytable, newtable)sum = 0for i = 1, table_maxn(mytable) dosum = sum + mytable[i]endfor i = 1, table_maxn(newtable) dosum = sum + newtable[i]endreturn sumend
})
newtable = {10,20,30}
print(mytable(newtable))
output
70
实例
mytable = setmetatable({ 10, 20, 30 }, {__tostring = function(mytable)sum = 0for k, v in pairs(mytable) dosum = sum + vendreturn "表所有元素的和为 " .. sumend
})
print(mytable)
output
表所有元素的和为 60
__add -> ‘+’
__sub -> ‘-’
__mul -> ‘*’
__div -> ‘/’
__mod -> ‘%’
__unm -> ‘-’
__concat -> ‘…’
__eq -> ‘==’
__lt -> ‘<’
__le -> ‘<=’