具有默认值的table
常规table中得任何字段默认都是nil,通过元表就可以很容易的修改这个默认值。
function setDefault(t,d)
local mt = {
__index = function()
return d
end
}
setmetatable(t,mt)
end
table跟踪
local _t = t
t = {}
local mt = {
__index = function(t,k)
print(“access to element “ .. testing(k))
return _t[k]
end
__newindex = function(t,k,v)
print(“update to element “..tostring(k) .. “to” .. testing(v))
_t[k] = v —更新原来的table
end
}
setmetatable(t,mt)
只读table
function gsReadOnlyTable(t)
local proxy = {}
local mt = {
__index = t;
__newindex = function(t,k,v)
error("attemp to update a read-only table")
end
}
setmetatable(proxy,mt)
return proxy
end
弱引用table
如果对象存在数组中,无法被回收,因为即使当前没有任何地方在使用它,数组仍引用着它。
弱引用就是一种会被垃圾收集器忽视的对象引用。
如果一个对象的所有引用都是弱引用,那么lua就可以回收这个对象了。并且还可以以某种形式来删除这些弱引用本身。
在一个弱引用中,table中得kay和value是可以回收的
3中弱引用table:
弱引用key
弱引用value
同事具有弱引用的key和value
无论哪种类型的弱引用table,只要有一个key或value被回收了,那么它们所在的整个条目都会从table中删除。
一个table的弱引用类型__mode字段来决定的。这个字段应为一个字符串,如果这个字符串中包含字母’k’,那么table的key时弱引用,如果这个字符串中包含v,那么这个table的value时弱引用
b = {__mode = ‘k’}