访问隐藏表

lua-users home
wiki

当需要向表中添加不应该被看到的额外信息时,可以使用元表来访问这些表。以下是一些访问这些表的方法,以及与普通表索引的比较。

-- Access inside table over __call
-- This is a very nice access since it only can be called over <this>()
function newT()
	-- create access to a table
	local _t = {}
	-- metatable
	local mt = {}
	mt.__call = function()
		-- hold access to the table over function call
		return _t
	end
	return setmetatable( {},mt )
end

-- Access inside table over commonly used variable self[self], inside __index
function newT2()
	local t = {}
	local mt = {}
	mt.__index = {
		[t] = {}
		}
	return setmetatable( t,mt )
end

-- Access inside table over nomal variable
-- disadvantage is that setting a key to _t will override
-- the access to the hidden table
function newT3()
	local mt = {}
	mt.__index = {
		_t = {}
		}
	return setmetatable( {},mt )
end

-- Access over nomal variable inside table
function newT4()
	local t = {}
	t._t = {}
	return t
end
-- CHILLCODE�
测试代码
t = newT()
t1 = os.clock()
for i = 1, 1000000 do
	-- set var 
	t()[i] = i
	--access var
	assert( t()[i] == i )
end
print("TIME1:",os.clock()-t1)

t = newT2()
t1 = os.clock()
for i = 1, 1000000 do
	-- set var 
	t[t][i] = i
	--access var
	assert( t[t][i] == i )
end
print("TIME2:",os.clock()-t1)

t = newT3()
t1 = os.clock()
for i = 1, 1000000 do
	-- set var 
	t._t[i] = i
	--access var
	assert( t._t[i] == i )
end
print("TIME3:",os.clock()-t1)

t = newT4()
t1 = os.clock()
for i = 1, 1000000 do
	-- set var 
	t._t[i] = i
	--access var
	assert( t._t[i] == i )
end
print("TIME4:",os.clock()-t1)
输出
TIME1:  0.67200000000003
TIME2:  0.86000000000001
TIME3:  0.60900000000004
TIME4:  0.56200000000001

因此,通过隐藏变量进行索引是第二快的,而应该避免使用表作为索引来调用变量,在某些情况下,通过 __call 进行访问可能是最合适的。


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2012 年 12 月 3 日下午 12:22 GMT (差异)