如何使用元表将每个索引更改为表格?

我正在尝试编写一个元表,使得所有对表的索引都上移一个位置(即t[i]应返回t[i+1])。我需要这样做是因为该表是使用索引1作为第一个元素进行定义的,但我必须与一个使用索引0作为第一个元素的程序进行接口。阅读《Lua编程》以来,我认为可以使用代理表来达成想要的效果,但我似乎无法让它正常工作。到目前为止,我有以下代码:

t = {"foo", "bar"}
local _t = t
t = {}
local mt = {
    __index =   function(t, i)
                    return _t[i+1]
                end
}
setmetatable(t, mt)

然而,这并没有创建预期的结果。实际上,它根本不返回任何值(每次查找都返回nil)。有没有更好的方法来实现这个,或者我只是漏了什么?

原文链接 https://stackoverflow.com/questions/5035278

点赞
stackoverflow用户148870
stackoverflow用户148870
t = {"foo", "bar"} 
local _t = t 
t = {} 
local mt = { 
    __index =   function(t, i) 
                    return _t[i+1] 
                end 
} 
setmetatable(t, mt)
 
print(t[0])

http://www.lua.org/cgi-bin/demo 上运行可以得到输出 "foo"。

将表 t 的值赋为 {"foo", "bar"},将这个表的引用赋给 _t。接着将 t 的值赋为空表。然后创建一个元表 mt,其中 __index 元方法会在表 t 中查找一个不存在的键时调用。__index 方法将查找 _t 表中的键 i+1 并返回该键对应的值。最后将表 t 与元表 mt 进行关联。因此,t[0] 实际上是在 _t 表中查找 1 这个键的值,即 "foo"。

2011-02-17 22:12:38