Перебор таблиц с pairs и ipairs
Безопасно перебирайте таблицы с помощью pairs() и ipairs().
«Перебор таблиц с pairs и ipairs» — бесплатный урок Lua Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
ipairs: упорядоченный перебор массива
ipairs(t) перебирает целочисленную последовательность, начиная с индекса 1, и возвращает пары (index, value). Перебор останавливается на первом nil. Это безопасный и предсказуемый вариант для таблиц, используемых как массивы, когда важен порядок.
local fruits = {"apple","banana","cherry"}
for i, fruit in ipairs(fruits) do
print(i, fruit)
end
-- 1 apple
-- 2 banana
-- 3 cherrypairs: все ключи
pairs(t) перебирает каждую пару «ключ–значение» с ненулевым значением в таблице в неопределённом порядке. Внутри используется функция next(). Используйте pairs для словарей, смешанных таблиц или когда нужно посетить все ключи независимо от их типа.
local info = {name="Lua", version=5.4, embedded=true}
for k, v in pairs(info) do
print(k, v)
end
-- name Lua
-- version 5.4
-- embedded true (order may vary)Выбор между pairs и ipairs
Используйте ipairs для последовательных массивов (порядок гарантирован, перебор останавливается на nil). Используйте pairs для словарей, смешанных таблиц или когда нужны все ключи. Применение pairs к массиву работает, но порядок не гарантируется. При использовании ipairs со словарём ключи, не являющиеся целыми числами, будут пропущены.
local mixed = {10, 20, label="hello", 30}
-- ipairs: only sees 10, 20, 30 in order
for i, v in ipairs(mixed) do
io.write(v .. " ")
end
print() -- 10 20 30
-- pairs: sees everything
for k, v in pairs(mixed) do
print(k, v)
endПодсчёт элементов
Для последовательностей #t возвращает количество элементов. Для словарей #t ненадёжен — выполните перебор с помощью pairs и подсчитайте элементы вручную. Это важное различие помогает избежать ошибок при работе со смешанными таблицами или таблицами со строковыми ключами.
local arr = {10, 20, 30}
print("#arr:", #arr) -- 3 (reliable)
local dict = {a=1, b=2, c=3}
print("#dict:", #dict) -- 0 (unreliable for dicts!)
local count = 0
for _ in pairs(dict) do count = count + 1 end
print("count:", count) -- 3Изменение значений во время перебора
Во время перебора с помощью pairs можно безопасно обновлять значение существующего ключа. Однако добавление или удаление ключей во время перебора приводит к неопределённому поведению. Соберите изменения и примените их после завершения цикла.
local prices = {apple=1.0, banana=0.5, cherry=2.0}
-- Safe: update existing values
for k, v in pairs(prices) do
prices[k] = v * 1.1 -- 10% markup
end
for k, v in pairs(prices) do
print(k, string.format("%.2f", v))
endСбор ключей
Распространённая операция — собрать все ключи в отсортированный массив для получения детерминированного результата. Выполните перебор с помощью pairs, чтобы собрать ключи, а затем используйте table.sort, чтобы упорядочить их.
local config = {host="localhost", port=8080, debug=true}
local keys = {}
for k in pairs(config) do
keys[#keys+1] = k
end
table.sort(keys)
for _, k in ipairs(keys) do
print(k, "=", config[k])
end
-- debug = true
-- host = localhost
-- port = 8080Перебор вложенных таблиц
Для вложенных таблиц (таблиц, содержащих таблицы) объедините два цикла: внешний цикл перебирает верхний уровень, а внутренний — каждую вложенную таблицу. Для действительно произвольной глубины вложенности этот шаблон дополняется рекурсией.
local matrix = {
{1,2,3},
{4,5,6},
{7,8,9},
}
for i, row in ipairs(matrix) do
for j, val in ipairs(row) do
io.write(string.format("%3d", val))
end
print()
endФильтрация с помощью ipairs
Создайте отфильтрованный список, выполняя перебор с помощью ipairs и добавляя элементы, удовлетворяющие предикату. Результатом будет новый массив, содержащий только подходящие элементы.
local function filter(t, pred)
local result = {}
for _, v in ipairs(t) do
if pred(v) then result[#result+1] = v end
end
return result
end
local nums = {1,2,3,4,5,6,7,8,9,10}
local evens = filter(nums, function(n) return n % 2 == 0 end)
print(table.concat(evens, " ")) -- 2 4 6 8 10Преобразование с помощью ipairs
Примените преобразование к каждому элементу: выполните перебор и создайте новый массив с преобразованными значениями. Это аналог функции map() из функциональных языков программирования в Lua.
local function map(t, fn)
local result = {}
for i, v in ipairs(t) do
result[i] = fn(v)
end
return result
end
local nums = {1, 2, 3, 4, 5}
local doubled = map(nums, function(n) return n * 2 end)
print(table.concat(doubled, " ")) -- 2 4 6 8 10
local words = {"hello","world"}
local upper = map(words, string.upper)
print(table.concat(upper, " ")) -- HELLO WORLDpairs с пользовательскими итераторами
Можно сделать пользовательский объект итерируемым, возвращая из функции итератор и состояние. Этот шаблон повторяет внутреннюю работу pairs: функция возвращает next, t, nil. Фабрика итератора аналогичным образом возвращает функцию и необязательное состояние.
local function values(t)
local i = 0
return function()
i = i + 1
return t[i]
end
end
for v in values({"x","y","z"}) do
print(v)
end
-- x
-- y
-- zБыстрая проверка
Какое утверждение о pairs() и ipairs() верно?
Итоги: pairs и ipairs
Краткое содержание:
ipairs: упорядоченный перебор, целочисленные ключи начиная с 1, остановка на nilpairs: все ключи, любой порядок, без преждевременной остановки- Используйте
pairsдля словарей, аipairs— для массивов - Никогда не добавляйте и не удаляйте ключи во время перебора с помощью pairs; обновлять существующие значения безопасно
- Собирайте и сортируйте ключи для получения детерминированного результата
Часто задаваемые вопросы
Урок «Перебор таблиц с pairs и ipairs» бесплатный?
Да — полный текст урока «Перебор таблиц с pairs и ipairs» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Перебор таблиц с pairs и ipairs»?
Безопасно перебирайте таблицы с помощью pairs() и ipairs(). Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Перебор таблиц с pairs и ipairs»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Таблицы как массивы
- Таблицы как словари
- Перебор таблиц с pairs и ipairs
- Вложенные таблицы и структурированные данные