lua的table默认值赋值

--[[
	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,默认值)