Lua 对于 __newindex元方法的使用注意事项

对于刚接触Lua的元方法__newindex的小伙伴可能会写出这样的代码 ,为什么会这样说,因为我就写过。

local function getlen (t)
	local len = 0;
	for k in pairs(t) do
		len = len +1;
	end
	return len;
end

local mt;

mt={
	property ={"jf","dee","tyt","iop"},
	__index = function(t,k)
		return mt.property[k]
	end,
	__call = function(delete)
		for k in pairs(delete) do
			if type(delete[k]) == "function" then
				delete[k]();
			end
		end
	end,
	__newindex = function (t, k, v)
		t[k]=v;
	end,
	__tostring = function(t)
		local l = {};
		for k in pairs(t) do
			if type(t[k]) ~= "function" and type(t[k]) ~= "table" then
				l[#l+1] = t[k];
			end
		end
		return "{".. table.concat(l,',').."}";
	end,
	__add = function(delete,even)
		delete[getlen(delete)+1] = even;
		return delete;
	end,
	name  = "mt"
};

function mt:new(o)
	o = o or {};
	setmetatable(o,self);
	return o;
end

a = mt:new{name = "a"};

function ad()
	print("sffwhyfwgefwe")
end

__ = a + ad;


--a();
a.x = 10

--print(a.x)


在上面的代码中__newindex里面的赋值方式是错误的,当程序运行时会报:C stack overflow错误,因为在__newindex 里面用上面的方法赋值时,会进入死循环,反复的调用__newindex,正确的做法是。当然这样的代码是没有任何实际意义的

	__newindex = function (t, k, v)
		--t[k]=v;
		rawset(t,k,v);
	end,

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值