جدولها (Tables) در لوا
جدول — تنها ساختار داده لوا: آرایه، دیکشنری، ترکیبی و ارجاع با مرجع
جدول: قلب لوا
لوا فقط یک ساختار داده دارد: جدول (Table)! جدول همزمان میتواند آرایه، لیست، دیکشنری، شیء و هر چیز دیگری باشد. این یکی از دلایل سادگی و قدرت لواست.
ساخت جدول
-- جدول خالی
local t = {}
-- بهعنوان آرایه
local arr = {10, 20, 30}
-- بهعنوان دیکشنری
local person = {name = "علی", age = 25}
-- ترکیبی!
local mixed = {
1, 2, 3, -- بخش آرایهای
title = "لیست", -- بخش دیکشنری
nested = {a = 1, b = 2}, -- جدول تو در تو
}
دسترسی به عناصر
local person = {name = "علی", age = 25, city = "تهران"}
-- دو روش معادل
print(person.name) -- علی
print(person["name"]) -- علی
-- کلید رشتهای با فاصله یا عدد
local t = {["کلید با فاصله"] = 1, [10] = "ده"}
print(t["کلید با فاصله"])
print(t[10])
ایندکس آرایه در لوا از ۱ شروع میشود، نه ۰!
arr[1] اولین عنصر است.افزودن و حذف
local t = {}
-- افزودن
t[1] = "اول"
t.name = "جدول من"
t["کلید"] = "مقدار"
-- حذف (با nil کردن)
t.name = nil -- کلید name حذف شد
-- افزودن به انتهای آرایه
local arr = {1, 2, 3}
arr[4] = 4 -- روش مستقیم
table.insert(arr, 5) -- روش استاندارد
جدولها با مرجع کار میکنند!
مهم: متغیر جدول، خود جدول نیست — آدرس آن است:
local a = {1, 2, 3}
local b = a -- b همان جدول است، کپی نیست!
b[1] = 100
print(a[1]) -- 100! چون هر دو یک جدولند
-- کپی واقعی باید دستی انجام شود
local function copy(t)
local new = {}
for k, v in pairs(t) do
new[k] = v
end
return new
end
local c = copy(a)
c[1] = 999
print(a[1]) -- هنوز 100
جدولهای تو در تو
local company = {
name = "لرنینگ سیتی",
employees = {
{name = "علی", role = "برنامهنویس"},
{name = "مریم", role = "طراح"},
},
address = {
city = "تهران",
street = "ولیعصر",
},
}
print(company.name)
print(company.employees[1].name) -- علی
print(company.address.city) -- تهران
-- تعداد کارمندان
print(#company.employees) -- 2
طول جدول با #
local arr = {10, 20, 30}
print(#arr) -- 3
-- فقط بخش آرایهای را میشمارد!
local mixed = {1, 2, 3, name = "تست"}
print(#mixed) -- 3 (name شمرده نمیشود)
جدول بهعنوان مجموعه (Set)
local visited = {}
visited["صفحه۱"] = true
visited["صفحه۲"] = true
if visited["صفحه۱"] then
print("قبلاً دیده شده!")
end
جدولها همهجا در لوا هستند: ماژولها، اشیاء، محیط سراسری (_G) — همه جدولاند!
این مبحث بخشی از دوره آموزش کامل لوا است.