Я работаю над проектом в Lua, где я буду создавать таблицы и хранить их в мастер-таблице, которая будет стерта позже. Я передам ссылки на эти таблицы другим родным таблицам.
master = {}
table.insert(master, {name = 'hello'})
table.insert(master, {name = 'world', pre = master[1]})
Проблема, которая возникает, заключается в том, что когда я хочу стереть ссылку из мастер-таблицы, ссылка все равно остается здесь в мастере [2]. Очевидно, мое первое решение состояло в том, чтобы таблицы имели слабые значения. (в режиме .__ на метатаблице, здесь не показывается)
Это сработало и сработало бы до тех пор, пока я бы никогда не сохранил таблицу с одиночной ссылкой в этих таблицах.
table.insert(master, {name = 'goodbye', pre = master[2], some_table = {123}})
Третий элемент, some_table
, в конечном итоге будет собран, поскольку таблицы имеют слабые значения, и на эту таблицу (some_table
) больше нигде нет ссылок. Это нежелательное поведение. Мое последнее решение заключается в создании «слабых ссылочных объектов» для таблиц в основной таблице. Вот наивная реализация:
function WeakRef(t)
r = {__mode = 'v', __index = t, __newindex = t}
setmetatable(r, r)
return r
end
Эти слабые эталонные объекты действуют аналогично boost::weak_ptr
с и достигают моей цели, но я не уверен, являются ли они лучшим решением моей проблемы.
Есть ли лучший способ; более элегантное решение?
Возможно, мой дизайн, для которого требуется этот мастер-стол, некорректен?