--[[
table 的弱引用,给table赋默认值
--]]
--------------------------------------------------------------------方法一------------------------------------------------------------------
--定义一个弱引用table作为容器,利用该容器去给其他table赋默认值
local defaults = {};
--如果default没有弱引用key,它会使所有具有默认值的table持久存在
--设置了key为弱引用后,当所有引用该key(table)的都不存在后,key(table)会释放掉。
setmetatable(defaults,{__mode = "k"});
local mt = {__index=function ( t ,k)
return defaults[t][k] --用“.”和 "[ ]"访问的重要区别:"."后不能接形参变量,而"[]"可以接形参变量
end}
function setdefaults( t , d)--table为需要赋初始值的table,defaults为值
defaults[t] = d;
setmetatable(t,mt);
end
local text= {};
setdefaults(text,{a=1});
print(text.a);
--------------------------------------------------------------------方法二------------------------------------------------------------------
--利用默认值作为备忘录的key,如果该key已经存在,则直接通过元表返回
--这里弱引用value,当metas中的元表在不使用时就可以被回收
local metas={}
setmetatable(metas,{__mode="v"});
function setdefaults2( t,d )
local mt=metas[d];
if mt==nil then
mt={__index =function( )
return d;
end}
metas[d]=mt; --备忘录
end
setmetatable(t,mt);
end
text2={};
setdefaults2(text2,{b=1});
print(text2.b);
lua的table默认值赋值
最新推荐文章于 2021-09-03 09:44:42 发布