Как я могу преобразовать каждый индекс в таблицу с помощью метатаблицы?

Я пытаюсь написать метатаблицу, чтобы все индексы в таблице были сдвинуты вверх на одну позицию (т.е. 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). Есть ли лучший способ сделать это, или я просто что-то упустил?


person multipleinterfaces    schedule 17.02.2011    source источник


Ответы (1)


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

print(t[0])

выводит "foo" для меня при запуске здесь: http://www.lua.org/cgi-bin/demo

person Amber    schedule 17.02.2011
comment
Спасибо что подметил это. Значит, это проблема со встроенным интерпретатором. - person multipleinterfaces; 18.02.2011