Я создал консоль 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: это мой первый пост, поэтому я прошу прощения, если я не следовал правилам проводки прекрасно, я попробовал :) и если кто-нибудь есть способ сделать поддельные и настоящие столы сбор мусора Я бы очень признателен
Не существует метаданных '__getn'. Вместо этого попробуйте '__len'. Это работает только на Lua 5.2 – moteus
love2d использует lua 5.1 к несчастью. Я пытаюсь создать функциональность __getn. Если вы посмотрите на код, который я разместил, я добавил функциональность для __next, __ getn (только версия table.getn), __ maxn, __ changeindex, __ setmetatable и собираюсь добавлять больше – KaoSDlanor
Вы не можете перегружать оператор '#' для таблицы в Lua 5.1. Вы можете использовать userdata для создания прокси-объекта. 't = newproxy (true) getmetatable (t) .__ len = function() return 5 end print (#t)' – moteus