English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

table (الجدول) في Lua

جدول هو نوع من بنية البيانات في Lua يساعدنا في إنشاء أنواع بيانات مختلفة مثل: قوائم، قوائم مرتبطة، إلخ.

يستخدم جدول Lua مصفوفات مرتبطة، يمكنك استخدام أي نوع من القيم كـ مفتاح للصفيف، لكن هذه القيمة لا يجب أن تكون nil.

جدول Lua ليس حجمه ثابتًا، يمكنك توسيعه حسب الحاجة.

تستخدم Lua الجدول لحل مشاكل الوحدات (module) والباقات (package) والأجسام (Object). على سبيل المثال، string.format تستخدم "format" لتحديد جدول string.

إنشاء جدول باستخدام table

المعطيات المكونة لجدول هي تعبيرات用于 إنشاء وتعريف الجدول. الجدول هو شيء قوي خاص بلغة Lua. أبسط معطيات إنشاء جدول هي {}، لإنشاء جدول فارغ. يمكن مباشرة تعريف قائمة من البيانات:

-- تعريف الجدول
mytable = {}
-- تحديد القيمة
mytable[1] = "Lua"
-- إزالة الاستدلال
mytable = NULL
-- نظام التجميد النفايات في Lua يحرر الذاكرة

عندما نضيف عناصر إلى جدول a ونقوم بتعيين a إلى b، فإن a و b يشيران إلى نفس الذاكرة. إذا تم تعيين a إلى nil إذا كان b يستطيع الوصول إلى عناصر الجدول، فإنه يمكن أن يستخدم نفس الجدول. إذا لم يكن هناك أي متغير يشير إلى a، فإن نظام التجميد النفايات في Lua سيقوم بحل النفايات المتعلقة بالذاكرة.

في هذا المثال، يتم عرض الحالة التي تم وصفها أعلاه:

-- جدول بسيط
mytable = {}
print("نوع mytable هو ", type(mytable))
mytable[1] = "Lua"
mytable["wow"] = "قبل التعديل"
print("العنصر في mytable بـ索引 1 هو ", mytable[1])
print("عنصر wow با استفاده از mytable است", mytable["wow"])
-- alternatetable و mytable يشيران إلى نفس الجدول
alternatetable = mytable
print("عنصر با استفاده از alternatetable در موقعیت 1 است", alternatetable[1])
print("عنصر wow با استفاده از mytable است", alternatetable["wow"])
alternatetable["wow"] = "تغییر شده"
print("عنصر wow با استفاده از mytable است", mytable["wow"])
-- آزاد کردن متغیرها
alternatetable = NULL
print("alternatetable است", alternatetable)
-- mytable همچنان قابل دسترسی است
print("عنصر wow با استفاده از mytable است", mytable["wow"])
mytable = NULL
print("mytable است", mytable)

نتیجه اجرای کد بالا به شرح زیر است:

نوع mytable table است
عنصر با استفاده از mytable در موقعیت 1 Lua است
عنصر wow با استفاده از alternatetable به عنوان NULL تغییر کرده است
عنصر با استفاده از alternatetable در موقعیت 1 Lua است
عنصر wow با استفاده از alternatetable به عنوان NULL تغییر کرده است
عنصر wow با استفاده از mytable به عنوان NULL تغییر کرده است
alternatetable NULL است
عنصر wow با استفاده از mytable به عنوان NULL تغییر کرده است
mytable NULL است

عملیات Table

در زیر، روش‌های معمول Table عملیاتی را لیست کرده‌ایم:

شماره‌گذاریروش و کاربرد
1table.concat (table [, sep [, start [, end]]]):

concat مخفف concatenate (چسبندگی، اتصال) است. تابع table.concat() تمام عناصر بخش آرایه table از موقعیت start تا end را در پارامترهای مشخص شده، با استفاده از نشانه‌ای مشخص شده (sep) جدا می‌کند.

2table.insert (table, [pos,] value):

یک عنصر با مقدار value در موقعیت(pos) بخش آرایه table قرار دهید. پارامتر pos اختیاری است و به صورت پیش‌فرض در انتهای بخش آرایه قرار می‌گیرد.

3table.maxn (table)

کلیدهای کلیدی مثبت table را مشخص کنید. اگر هیچ عنصر کلیدی مثبتی وجود نداشته باشد، 0 بازمی‌گرداند. (بعد Lua5.2 این روش وجود ندارد، در این مقاله از تابع شخصی استفاده شده است)

4table.remove (table [, pos])

返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。

5table.sort (table [, comp])

对给定的table进行升序排序。

接下来我们来看下这几个方法的示例。

Table 连接

我们可以使用 concat() 输出一个列表中元素连接成的字符串:

fruits = {\"banana\",\"orange\",\"apple\"}
-- 返回 table 连接后的字符串
print(\"连接后的字符串 \",table.concat(fruits))
-- 指定连接字符
print(\"连接后的字符串 \",table.concat(fruits,", "))
-- 指定索引来连接 table
print(\"连接后的字符串 \",table.concat(fruits,", ", 2,3))

النتيجة التي يتم إرجاعها عند تنفيذ الكود أعلاه هي:

连接后的字符串 bananaorangeapple
连接后的字符串 banana, orange, apple
连接后的字符串 orange, apple

插入和移除

以下示例演示了 table 的插入和移除操作:

fruits = {\"banana\",\"orange\",\"apple\"}
-- 在末尾插入
table.insert(fruits,"mango")
print(\"索引为 4 的元素为 \",fruits[4])
-- 在索引为 2 的键处插入
table.insert(fruits,2,"grapes")
print(\"索引为 2 的元素为 \",fruits[2])
print(\"最后一个元素为 \",fruits[5])
table.remove(fruits)
print(\"移除后最后一个元素为 \",fruits[5])

النتيجة التي يتم إرجاعها عند تنفيذ الكود أعلاه هي:

索引为 4 的元素为 mango
索引为 2 的元素为 grapes
最后一个元素为 mango
移除后最后一个元素为 nil

Table 排序

以下示例演示了 sort() 方法的使用,用于对 Table 进行排序:

fruits = {\"banana\",\"orange\",\"apple\",\"grapes\"}
print(\"排序前\
for k,v in ipairs(fruits) do
        print(k,v)
end
table.sort(fruits)
print("مقارنة بعد الترتيب")
for k,v in ipairs(fruits) do
        print(k,v)
end

النتيجة التي يتم إرجاعها عند تنفيذ الكود أعلاه هي:

مقارنة قبل الترتيب
1        banana
2        orange
3        apple
4        grapes
مقارنة بعد الترتيب
1        apple
2        banana
3        grapes
4        orange

أكبر قيمة في Table

لم يعد method table.maxn موجودًا بعد Lua5.2، لذا قمنا بتعريف method table_maxn لتحقيقه.

في هذا المثال، نعرض كيفية الحصول على القيمة الأكبر في table:

function table_maxn(t)
  local mn = nil;
  for k, v in pairs(t) do
    if(mn==nil) then
      mn = v
    end
    if mn < v then
      mn = v
    end
  end
  return mn
end
tbl = {[1] = 2, [2] = 6, [3] = 34, [26] = 5}
print("القيمة الأكبر في tbl ", table_maxn(tbl))
print("طول tbl ", #tbl)

النتيجة التي يتم إرجاعها عند تنفيذ الكود أعلاه هي:

القيمة الأكبر في tbl 34
طول tbl 3

ملاحظة:

عندما نحصل على طول table سواء باستخدام # أو table.getn، فإنه يوقف الحساب عند نقطة انقسام المؤشر مما يؤدي إلى عدم الحصول على طول table بشكل صحيح.

يمكنك استخدام الطريقة التالية بدلاً منها:

function table_leng(t)
  local leng=0
  for k, v in pairs(t) do
    leng=leng+1
  end
  return leng;
end