English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
جدول هو نوع من بنية البيانات في Lua يساعدنا في إنشاء أنواع بيانات مختلفة مثل: قوائم، قوائم مرتبطة، إلخ.
يستخدم جدول Lua مصفوفات مرتبطة، يمكنك استخدام أي نوع من القيم كـ مفتاح للصفيف، لكن هذه القيمة لا يجب أن تكون nil.
جدول Lua ليس حجمه ثابتًا، يمكنك توسيعه حسب الحاجة.
تستخدم Lua الجدول لحل مشاكل الوحدات (module) والباقات (package) والأجسام (Object). على سبيل المثال، string.format تستخدم "format" لتحديد جدول string.
المعطيات المكونة لجدول هي تعبيرات用于 إنشاء وتعريف الجدول. الجدول هو شيء قوي خاص بلغة 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 عملیاتی را لیست کردهایم:
شمارهگذاری | روش و کاربرد |
---|---|
1 | table.concat (table [, sep [, start [, end]]]): concat مخفف concatenate (چسبندگی، اتصال) است. تابع table.concat() تمام عناصر بخش آرایه table از موقعیت start تا end را در پارامترهای مشخص شده، با استفاده از نشانهای مشخص شده (sep) جدا میکند. |
2 | table.insert (table, [pos,] value): یک عنصر با مقدار value در موقعیت(pos) بخش آرایه table قرار دهید. پارامتر pos اختیاری است و به صورت پیشفرض در انتهای بخش آرایه قرار میگیرد. |
3 | table.maxn (table) کلیدهای کلیدی مثبت table را مشخص کنید. اگر هیچ عنصر کلیدی مثبتی وجود نداشته باشد، 0 بازمیگرداند. (بعد Lua5.2 این روش وجود ندارد، در این مقاله از تابع شخصی استفاده شده است) |
4 | table.remove (table [, pos]) 返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。 |
5 | table.sort (table [, comp]) 对给定的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
以下示例演示了 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
لم يعد 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