-- 如果__newindex元方法是一个函数,则会把该table,该key,该value作为参数传进函数 mytable = setmetatable({key1 = "value1"}, { __newindex = function(mytable, key, value) rawset(mytable, key, """..value..""") end }) mytable.key1 = "new value" mytable.key2 = 4 print(mytable.key1,mytable.key2) --[[ 输出结果: new value "4" ]]
为表添加操作符(类似于运算符重载)
元方法
对应运算符
__add
+
__sub
-(减号)
__mul
*
__div
/
__mod
%
_unm
-(负号)
__concat
..
__eq
==
__lt
<
__le
<=
__call元方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-- __call元方法在该表被当成函数来调用时会调用 mytable=setmetatable({10},{ __call=function(mytable,newtable) local sum=0 for i=1,#mytable do sum=sum+mytable[i] end for i=1,#newtable do sum=sum+newtable[i] end return sum end }) newtable={10,20,30} print(mytable(newtable)) -- 输出结果:70
__tostring元方法
1 2 3 4 5 6 7 8 9 10 11
-- __tostring 元方法用于修改表的输出行为 mytable = setmetatable({ 10, 20, 30 }, { __tostring = function(mytable) local sum = 0 for k, v inpairs(mytable) do sum = sum + v end return"表所有元素的和为 " .. sum end }) print(mytable) -- 输出结果:表所有元素的和为 60