پیمایش جدول‌ها در لوا

پیمایش با pairs و ipairs، تفاوت‌ها، ترتیب و ساخت iterator سفارشی

دو تابع پیمایش اصلی

لوا دو تابع استاندارد برای پیمایش جدول‌ها دارد:

ipairs — برای آرایه‌ها

local arr = {"الف", "ب", "ج"}

for i, v in ipairs(arr) do
print(i, v)
end
-- 1 الف
-- 2 ب
-- 3 ج

ویژگی‌های ipairs:

pairs — برای همه جدول‌ها

local person = {name = "علی", age = 25, city = "تهران"}

for k, v in pairs(person) do
print(k .. " = " .. tostring(v))
end

ویژگی‌های pairs:

ترتیب مهم است؟ کلیدها را مرتب کنید

چون pairs ترتیب ندارد، برای پیمایش مرتب باید کلیدها را جدا و مرتب کنیم:

local scores = {علی = 18, مریم = 20, رضا = 16}

-- جمع‌آوری و مرتب‌سازی کلیدها
local keys = {}
for k in pairs(scores) do
table.insert(keys, k)
end
table.sort(keys)

-- پیمایش مرتب
for _, k in ipairs(keys) do
print(k, scores[k])
end

پیمایش با ترتیب درج

ترفند رایج: نگه‌داری ترتیب در آرایه جداگانه:

local ordered = {}
local data = {}

local function set(key, value)
if data[key] == nil then
table.insert(ordered, key)   -- فقط بار اول
end
data[key] = value
end

set("اول", 1)
set("دوم", 2)
set("سوم", 3)

for _, k in ipairs(ordered) do
print(k, data[k])
end

iterator سفارشی

می‌توانید iterator خودتان را بسازید — تابعی که هر بار مقدار بعدی را می‌دهد:

-- iterator اعداد زوج
local function evens(limit)
local n = 0
return function()
n = n + 2
if n <= limit then return n end
return nil
end
end

for e in evens(10) do
print(e)   -- 2, 4, 6, 8, 10
end

مثال: شمارش عناصر

local function countTypes(t)
local counts = {}
for _, v in pairs(t) do
local tname = type(v)
counts[tname] = (counts[tname] or 0) + 1
end
return counts
end

local mixed = {1, "دو", 3.5, true, "پنج"}
for typeName, count in pairs(countTypes(mixed)) do
print(typeName .. ": " .. count)
end

کدام را استفاده کنم؟

وضعیتتابع
آرایه (ایندکس متوالی)ipairs
دیکشنریpairs
ترتیب مهم استکلیدها را مرتب کنید
پیمایش سفارشیiterator بسازید

این مبحث بخشی از دوره آموزش کامل لوا است.

ابزارهای مرتبط