0Pricing
Lua Academy · Урок

Таблицы как словари

Используйте строковые и смешанные ключи для хранения пар «ключ—значение».

«Таблицы как словари» — бесплатный урок Lua Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Строковые ключи

Таблицы со строковыми ключами работают как словари (хеш-таблицы). Обращайтесь к полям через точечную нотацию t.key (для допустимых идентификаторов) или через скобочную нотацию t["key"] (для любой строки). Обе формы эквивалентны; скобочная нотация поддерживает динамические ключи.

local user = {}
user.name = "Alice"
user["age"] = 30
user.role = "admin"

print(user.name)        -- Alice
print(user["age"])      -- 30

local field = "role"
print(user[field])      -- admin (dynamic key)

Литералы таблиц

Словари можно инициализировать с помощью литерала таблицы, используя синтаксис key = value. Это самый распространённый способ создания записей в Lua. В одном литерале можно сочетать элементы в стиле массива и словаря.

local config = {
  host = "localhost",
  port = 3306,
  database = "myapp",
  debug = false,
  tags = {"web", "api"},  -- nested array
}

print(config.host)        -- localhost
print(config.port)        -- 3306
print(config.tags[1])     -- web

Подсчёт с помощью словарей

Классический вариант использования словаря — подсчёт частот. Выполняйте перебор списка, используя каждый элемент как ключ и увеличивая счётчик. Перед увеличением проверьте значение на nil — используйте count[word] or 0 как начальное значение.

local words = {"lua","is","fast","lua","is","lua"}
local freq = {}

for _, w in ipairs(words) do
  freq[w] = (freq[w] or 0) + 1
end

for word, count in pairs(freq) do
  print(word, count)
end
-- lua 3, is 2, fast 1

Группировка с помощью словарей

Чтобы сгруппировать данные по свойству, переберите список и используйте ключ группировки, чтобы добавлять элементы в список внутри словаря. Это аналог GROUP BY в SQL или шаблона defaultdict в Python.

local people = {
  {name="Alice", dept="eng"},
  {name="Bob",   dept="hr"},
  {name="Carol", dept="eng"},
  {name="Dave",  dept="hr"},
}
local groups = {}

for _, p in ipairs(people) do
  local d = p.dept
  groups[d] = groups[d] or {}
  groups[d][#groups[d]+1] = p.name
end

print(table.concat(groups.eng, ", "))  -- Alice, Carol

Проверка существования ключа

Проверьте существование ключа, сравнив его значение с nil. Будьте внимательны: если значение, хранящееся по ключу, равно nil, ключ считается отсутствующим. Для обозначения наличия храните в качестве значения true, а не nil.

local cache = {result=42, mode="fast"}

if cache.result ~= nil then
  print("cached:", cache.result)  -- 42
end

-- Key not present:
if cache.timeout == nil then
  print("no timeout set")
end

-- Membership set pattern
local allowed = {admin=true, editor=true}
if allowed["admin"] then
  print("access granted")
end

Удаление ключей

Чтобы удалить ключ таблицы, присвойте ему значение nil. Пара ключ–значение исчезнет, и сборщик мусора сможет освободить память, занятую значением. Таким способом нельзя удалить локальную переменную — только элемент таблицы.

local session = {token="abc123", user="Alice", expires=3600}
print(session.token)   -- abc123

session.token = nil
print(session.token)   -- nil (removed)

-- Count remaining keys
local count = 0
for _ in pairs(session) do count = count + 1 end
print(count)   -- 2

Объединение словарей

Объедините две таблицы, перебрав одну из них и скопировав её элементы в другую. Если в обеих таблицах есть один и тот же ключ, будет использовано значение из второй таблицы. Это аналог Object.assign в JavaScript.

local defaults = {color="blue", size=12, bold=false}
local overrides = {color="red", italic=true}

local function merge(base, over)
  local result = {}
  for k, v in pairs(base) do result[k] = v end
  for k, v in pairs(over) do result[k] = v end
  return result
end

local opts = merge(defaults, overrides)
print(opts.color, opts.size, opts.italic)  -- red 12 true

Ключи любого типа

Ключами таблицы могут быть любые значения, отличные от nil и NaN: строки, числа, логические значения, функции и даже другие таблицы. Целочисленные и строковые ключи хранятся внутри по-разному, но доступны единообразно через скобочную нотацию.

local t = {}
local function myKey() end

t["string"] = 1
t[42] = 2
t[true] = 3
t[myKey] = 4

print(t["string"])  -- 1
print(t[42])        -- 2
print(t[true])      -- 3
print(t[myKey])     -- 4

Упорядоченный перебор

pairs() в Lua не гарантирует порядок перебора. Чтобы выполнять перебор в определённом порядке, соберите ключи в массив, отсортируйте его, а затем выполните перебор.

local scores = {Alice=95, Bob=87, Carol=91, Dave=78}

local names = {}
for name in pairs(scores) do
  names[#names+1] = name
end
table.sort(names)

for _, name in ipairs(names) do
  print(name, scores[name])
end
-- Alice 95, Bob 87, Carol 91, Dave 78 (sorted)

Шаблон значений по умолчанию

Полезный шаблон — таблица «значений по умолчанию», подключённая через метатаблицу __index. Если ключ не найден в основной таблице, Lua ищет его в таблице значений по умолчанию. Это позволяет создавать многоуровневую конфигурацию без объединения таблиц.

local defaults = {timeout=30, retries=3, verbose=false}
local config = {timeout=60}

setmetatable(config, {__index = defaults})

print(config.timeout)  -- 60  (overridden)
print(config.retries)  -- 3   (from defaults)
print(config.verbose)  -- false (from defaults)

Быстрая проверка

Как удалить ключ "x" из таблицы t в Lua?

Итоги: таблицы как словари

Основные моменты:

  • Точечная и скобочная нотация: t.key == t["key"]
  • Ключом может быть любое значение, отличное от nil и NaN
  • Присвойте ключу nil, чтобы удалить его
  • Подсчёт частот: t[k] = (t[k] or 0) + 1
  • Упорядоченный перебор: собрать ключи → отсортировать → перебрать
  • Используйте метатаблицу __index для значений по умолчанию

Часто задаваемые вопросы

Урок «Таблицы как словари» бесплатный?

Да — полный текст урока «Таблицы как словари» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Таблицы как словари»?

Используйте строковые и смешанные ключи для хранения пар «ключ—значение». Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Таблицы как словари»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Таблицы как массивы
  2. Таблицы как словари
  3. Перебор таблиц с pairs и ipairs
  4. Вложенные таблицы и структурированные данные
← Назад к Lua Academy