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);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值