Слабые ключи и слабые значения
Создавайте слабые таблицы с __mode='k', 'v' или 'kv' для структур, подобных кэшу.
«Слабые ключи и слабые значения» — бесплатный урок Lua Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Что такое слабые таблицы?
Слабая таблица содержит ссылки, которые не препятствуют сборке мусора. Объекты в слабых таблицах могут быть удалены, даже пока сама таблица существует.
Метаметод __mode
Задайте __mode в метатаблице, чтобы управлять слабостью: "k" — слабые ключи, "v" — слабые значения, "kv" — и те и другие.
local weakValues = setmetatable({}, {__mode = "v"})
local weakKeys = setmetatable({}, {__mode = "k"})Пример слабых значений
Кэш, значения которого могут быть удалены, когда других ссылок на них не существует.
local cache = setmetatable({}, {__mode = "v"})
local function getObject(key)
if not cache[key] then
cache[key] = {data = key} -- expensive to create
end
return cache[key]
endПосле сборки мусора слабые значения исчезают
Когда единственная ссылка на объект находится в таблице со слабыми значениями, сборщик мусора удаляет объект, а запись исчезает.
local t = setmetatable({}, {__mode = "v"})
do
local obj = {}
t[1] = obj
print(t[1]) -- table: 0x...
end
collectgarbage()
print(t[1]) -- nil (collected)Пример слабых ключей
Слабые ключи позволяют связать метаданные с объектами, не препятствуя их удалению. Когда объект-ключ удаляется, запись также удаляется.
local meta = setmetatable({}, {__mode = "k"})
local function attachMeta(obj, data)
meta[obj] = data
endШаблон аннотирования объектов
Добавляйте к объектам дополнительные данные с помощью таблицы со слабыми ключами. Когда объект удаляется сборщиком мусора, аннотация автоматически удаляется.
local annotations = setmetatable({}, {__mode = "k"})
annotations[myObj] = {created = os.time(), owner = "Alice"}
print(annotations[myObj].owner)Слабые ключи и значения таблицы
Таблица "kv" содержит и слабые ключи, и слабые значения. Только живые ключи, на которые ссылаются где-либо ещё, сохраняют свои записи.
Таблицы эфемеронов
В Lua 5.2 и более новых версиях таблицы со слабыми ключами являются эфемеронами: если единственная ссылка на значение проходит через ключ, оба объекта удаляются вместе. Это предотвращает неожиданное удержание объектов.
Шаблон кэша со слабыми значениями
Классический вариант использования — кэширование результатов, при котором кэш освобождает результаты при нехватке памяти без ручного удаления записей.
local function weakMemo(fn)
local cache = setmetatable({}, {__mode = "v"})
return function(x)
if not cache[x] then cache[x] = fn(x) end
return cache[x]
end
endОграничения
Слабые таблицы не могут содержать примитивные типы (числа, логические значения, строки) как слабые значения: сборщик мусора не может их удалить (строки интернируются).
Когда использовать слабые таблицы
- Для кэшей объектов, которые должны освобождать память при её нехватке.
- Для связывания метаданных с внешними объектами.
- Для реализации таблиц интернирования пользовательских объектов.
Вопрос о слабых таблицах
Что делает __mode = "v" в метатаблице?
Повторение: слабые ключи и значения
Слабые таблицы используют __mode = "k", "v" или "kv", позволяя сборщику мусора удалять их ключи и значения. Это необходимо для безопасных с точки зрения памяти кэшей и шаблонов аннотирования объектов.
Часто задаваемые вопросы
Урок «Слабые ключи и слабые значения» бесплатный?
Да — полный текст урока «Слабые ключи и слабые значения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Слабые ключи и слабые значения»?
Создавайте слабые таблицы с __mode='k', 'v' или 'kv' для структур, подобных кэшу. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Слабые ключи и слабые значения»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы сборщика мусора Lua
- Слабые ключи и слабые значения
- Финализаторы с __gc
- Предотвращение утечек памяти