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(), вы увидите все пять записей, включая строковые ключи.
Задание
ЛегкоНапишите функцию 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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов