Как я могу изменить каждый индекс в таблицу, используя метатаблицу? - PullRequest
2 голосов
/ 18 февраля 2011

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

1 Ответ

3 голосов
/ 18 февраля 2011
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

...