一、具有默认值的table --通过__index实现
首先 我们都知道table中的任何字段的默认值是nil 我们可以通过元表来修改table的默认值
function setDefault(t, d)
local mt = { __index = function() return d end}
setmetatable(t, mt)
end
function main()
local table1 = {x = 100, y = 1000}
print(table1.x, table1.y,table1.q) -- 100 1000 nil
setDefault(table1, 88888)
print(table1.x, table1.y, table1.q) --100 1000 88888
end
上面的代码中 setDefault函数为所有需要默认值的table创建了一个新的元表 这样开销太大 并且元表中默认值是与元方法关联在一起的 所以setDefault函数无法为所有的table使用同一个元表 如何解决不同默认值使用同一个元表呢 只要增加一个字段即可
--利用___这个字段将每个table的默认值保存在它本身中
local mt = { __index = function(t) return t.___ end}
function setDefault1(t, d)
t.___ = d
setmetatable(t, mt)
end
__是为了防止名字冲突而起的名字 如果还担心名字冲突 可以再增加一个key 唯一标识
--防止名字冲突 可以用本身table中的一个key保存默认值
local key = {}
function setDefault3(t, d)
local mt = { __index