Menu
Coddy logo textTech

pairs() против ipairs()

Часть раздела Logic & Flow путешествия по Lua на Coddy — урок 3 из 54.

Теперь, когда вы изучили и pairs(), и ipairs(), важно понимать, когда использовать каждый из них. Выбор полностью зависит от структуры вашей таблицы и того, чего вы пытаетесь достичь.

Используйте ipairs(), когда у вас есть таблица в стиле списка с последовательными целочисленными ключами, начинающимися с 1. Она обрабатывает элементы по порядку и останавливается на первом значении nil, что делает её идеальной для массивов, где важен порядок.

Используйте pairs(), когда в вашей таблице есть строковые ключи, смешанные типы ключей или когда вам нужно получить доступ ко всем записям независимо от пропусков. Она перебирает каждую пару ключ-значение в таблице без какого-либо определенного порядка.

Рассмотрим эту смешанную таблицу:

local gameData = {
    "Level 1",
    "Level 2", 
    "Level 3",
    currentLevel = 2,
    playerName = "Hero"
}

Если вы используете ipairs(), вы увидите только три строки уровней. Если вы используете pairs(), вы увидите все пять записей, включая строковые ключи.

challenge icon

Задание

Легко

Напишите функцию countSequentialItems, которая принимает таблицу data и возвращает количество элементов с последовательными целочисленными ключами.

Используйте ipairs() для подсчета количества элементов в последовательной части таблицы (начиная с индекса 1 до первого nil). Это поможет вам понять разницу между ipairs() и pairs() при работе со смешанными таблицами.

Параметры:

  • data (table): Смешанная таблица, содержащая как последовательные целочисленные ключи, так и строковые ключи

Возвращает: Количество последовательных элементов (number)

Шпаргалка

Используйте ipairs() для таблиц в стиле списков с последовательными целочисленными ключами, начинающимися с 1. Она обрабатывает элементы по порядку и останавливается на первом значении nil:

for i, value in ipairs(myList) do
    -- обрабатывает только последовательные элементы
end

Используйте pairs() для таблиц со строковыми ключами, смешанными типами ключей или когда вам нужно получить доступ ко всем записям независимо от пропусков. Она перебирает каждую пару ключ-значение без определенного порядка:

for key, value in pairs(myTable) do
    -- обрабатывает все пары ключ-значение
end

Пример со смешанной таблицей:

local gameData = {
    "Level 1",
    "Level 2", 
    "Level 3",
    currentLevel = 2,
    playerName = "Hero"
}

-- ipairs() видит только: "Level 1", "Level 2", "Level 3"
-- pairs() видит все пять записей

Попробуйте сами

function countSequentialItems(data)
    -- Напишите код здесь
end
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow