0Pricing
Lua Academy · Урок

Слабые ключи и слабые значения

Создавайте слабые таблицы с __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 — локальная установка не требуется.

Все уроки этого курса

  1. Основы сборщика мусора Lua
  2. Слабые ключи и слабые значения
  3. Финализаторы с __gc
  4. Предотвращение утечек памяти
← Назад к Lua Academy