2014-02-11 5 views
4

Я создал консоль lua на движке love2d, который не имеет значения. Я пытаюсь обновить metatables, чтобы иметь возможность делать больше вещей (функции пар, изменение метатемы на другой таблице вместо целевого и т. Д.), И одна из добавок, которые я создаю, - это событие __changeindex, когда вы изменяете существующий индекс.изменить # operator in lua

Для этого я должен предоставить пользователю фиктивную таблицу, которая не содержит значений, и когда они попытаются добавить что-либо, проверьте, если она уже определена в реальной таблице, если она затем вызывает __changeindex, если она затем не звонить __newindex. Это прекрасно работает, но это приводит к тому, что многие другие функции таблицы Lua перестают работать (для циклов/getmetatable/setmetatable). Я сделал обходные пути для большинства из этих вопросов, и они работают нормально, но я не могу получить работу оператора #t, я хотел бы быть в состоянии сказать

t1={1,2,3} 
t2=setmetatable({},{__getn=function(self) return #t1 end}) 

, а затем # t2 должны действительно вернуться # t1. Есть ли способ для меня сделать это?

мой существующий код для этого можно найти here

EDIT: это мой первый пост, поэтому я прошу прощения, если я не следовал правилам проводки прекрасно, я попробовал :) и если кто-нибудь есть способ сделать поддельные и настоящие столы сбор мусора Я бы очень признателен

+6

Не существует метаданных '__getn'. Вместо этого попробуйте '__len'. Это работает только на Lua 5.2 – moteus

+0

love2d использует lua 5.1 к несчастью. Я пытаюсь создать функциональность __getn. Если вы посмотрите на код, который я разместил, я добавил функциональность для __next, __ getn (только версия table.getn), __ maxn, __ changeindex, __ setmetatable и собираюсь добавлять больше – KaoSDlanor

+4

Вы не можете перегружать оператор '#' для таблицы в Lua 5.1. Вы можете использовать userdata для создания прокси-объекта. 't = newproxy (true) getmetatable (t) .__ len = function() return 5 end print (#t)' – moteus

ответ

2

Нет __getn metamethod. Вместо этого попробуйте __len. Это работает только на Lua 5.2

Вы не можете перегрузить # оператора для таблиц в Lua 5.1

Вы можете использовать UserData для создания прокси-объекта:

t = newproxy(true) 
getmetatable(t).__len = function() 
    return 5 
end 

print(#t) --> 5 

Однако обратите внимание, что функция newproxy является undocumented.