您的位置:首页 > 编程语言 > Lua

lua table访问的元方法

2015-11-09 16:19 453 查看
1。__index元方法

Window = {} --创建一个名字空间

--使用默认值来创建一个原型

Window.prototype = {x=0,y=0,width=100,height=100}

Windwo.mt = {} --创建元表

--声明构造函数

function Window.new(o)

setmetatable(o,Window.mt)

return o

end

定义__index元方法:

Window.mt.__index = function(table,key)

return Window.prototype(key)

end

w = Window.new{x=10,y =20}

print(w.width) -->200

__index元方法不必一定是一个函数,也可以是一个table,

例如 Window.mt.__index = Window.prototype这个跟上面的函数是等效的

2.__newindex元方法

__newindex元方法与__index 类似,不同之处在于前者用于table的更新,而后者用于table的查询

3.具有默认值的table

function setDefault(t,d)

local mt = {__index = function() return d end}

setmetatable(t,mt)

end

tab = {x=10,y=20}

print(tab.x,tab.z) -->10,nil

print(tab.x,tab.z) -->10,0

但是这个方法不好,默认值d和元方法关联在一起了,无法为所有table都使用用一个元表,改进一下,把默认值存放在table本身中,用一个额外的字段保存

local mt = {__index = function(t) return t.___end}

function setDefault(t,d)

t.___ = d

setmetatable(t,mt)

end

4.跟踪table的访问

local index = {} --创建私有索引

local mt = {

__index = function(t,k)

print("* access to element "..tostring(k))

return t[index][k]

end

__newindex = function(t,k,v)

print("*update of element " ..tostring(k).."to"..tostring(v))

t[index][k] = v --更新原来的table

end

}

function track(t)

local proxy = {}

proxy[index] = t

setmetatable(proxy,mt)

return proxy

end

现在,若要监视table t,唯一要做的就是执行: t = track(t)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: