0Pricing
Lua Academy · Урок

Перебор таблиц с 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  cherry

pairs: все ключи

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 WORLD

pairs с пользовательскими итераторами

Можно сделать пользовательский объект итерируемым, возвращая из функции итератор и состояние. Этот шаблон повторяет внутреннюю работу 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, остановка на nil
  • pairs: все ключи, любой порядок, без преждевременной остановки
  • Используйте 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 — локальная установка не требуется.

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

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