对于刚接触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,