پیمایش جدولها در لوا
پیمایش با pairs و ipairs، تفاوتها، ترتیب و ساخت iterator سفارشی
دو تابع پیمایش اصلی
لوا دو تابع استاندارد برای پیمایش جدولها دارد:
ipairs — برای آرایهها
local arr = {"الف", "ب", "ج"}
for i, v in ipairs(arr) do
print(i, v)
end
-- 1 الف
-- 2 ب
-- 3 ج
ویژگیهای ipairs:
- از ایندکس ۱ شروع میکند
- تا اولین
nilادامه میدهد - ترتیب تضمینشده است (۱، ۲، ۳، ...)
- فقط کلیدهای عددی متوالی را میبیند
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 بسازید |
این مبحث بخشی از دوره آموزش کامل لوا است.