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

أنواع البيانات في Lua

Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。

Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。

数据类型描述
nil这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
boolean包含两个值:false和true。
number表示双精度类型的实浮点数
string字符串由一对双引号或单引号来表示
function由 C 或 Lua 编写的函数
userdata表示任意存储在变量中的C数据结构
thread表示执行的独立线路,用于执行协同程序
tableLua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。

我们可以使用 type 函数测试给定变量或者值的类型:

print(type("Hello world"))      --> string
print(type(10.4*3))             --> number
print(type(print))              --> function
print(type(type))               --> function
print(type(true))               --> boolean
print(type(nil)) --> nil
print(type(type(X))) --> string

nil (فراغ)

نوع nil يُمثل نوعًا لا يحتوي على أي قيمة معتبرة، لديه قيمة واحدة فقط -- nil، مثلًا، عند طباعة variable لم يتم تعيينه، سيتم طباعة قيمة nil:

> print(type(a))
nil
>

للمعلمات العامة و tables، لدى nil أيضًا دور "حذف"، إذ أن تعيين nil لمعلمعة عالمية أو variable في table يعني حذفها، اقرأ الكود التالي لمعرفة ذلك:

tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end
 
tab1.key1 = nil
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end

عند مقارنة nil يجب إضافة الأسلاك "":

> type(X)
nil
> type(X) == nil
false
> type(X) == "nil"
true
>

نتيجة type(X) == nil هي false السبب في ذلك هو أن type(X) في الواقع يعود كـ "nil" كـ string، وهو نوع string:

type(type(X)) == string

boolean (بوليان)

نوع boolean يحتوي على قيمتين محتملتين فقط: true (صحيح) و false (خطأ)، Lua يعتبر false و nil كـ false، والجميع الآخرين كـ true، رقم 0 هو أيضًا true:

print(type(true))
print(type(false))
print(type(nil))
 
if false or nil then
    print("على الأقل واحد هو true")
else
    print("false و nil كلاهما false")
end
if 0 then
    print("رقم 0 هو true")
else
    print("رقم 0 هو false")
end

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

$ lua test.lua 
boolean
boolean
nil
false و nil كلاهما false
رقم 0 هو true

number (رقم)

Lua الافتراضي لديه نوع واحد فقط من number - نوع double (نوع double يمكن تعديله في luaconf.h)، جميع الطرق التالية تعتبر كنوع number:

طباعة نوع(2)
طباعة نوع(2.2)
طباعة نوع(0.2)
طباعة نوع(2e+1)
طباعة نوع(0.2e-1)
طباعة نوع(7.8263692594256e-06)

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

number
number
number
number
number
number

string (النص)

يُمثل النص بأحداثين من الأقواس المزدوجة أو المزدوجة الواحدة.

string1 = "this is string1"
string2 = 'this is string2'

يمكن أيضًا استخدام بياناتين مزدوجتين "[[]]" لتمثيل "كتلة" نصية.

مثال على الإنترنت

html = [[
<html>
<head></head>
<body>
    <a href="http://ar.oldtoolbag.com/"></a>موقع تعليمي أساسي
</body>
</html>
]]
طباعة(html)
نتيجة تنفيذ الكود التالي هي:
<html>
<head></head>
<body>
    <a href="http://ar.oldtoolbag.com/"></a>موقع تعليمي أساسي
</body>
</html>

عند إجراء عملية حسابية على نص عدد،يحاول Lua تحويل هذا النص العددي إلى عدد:

> طباعة (2 + 6)
8.0
> طباعة ("2" + 6)
8.0
> طباعة ("2" + "6")
2 + 6
> طباعة ("-2e2" * "6")
-1200.0
> طباعة ("error" + 1)
stdin:1: محاولة إجراء حساب على قيمة نصية
traceback stack:
        stdin:1: في الكتلة الرئيسية
        [C]: في؟
>

في الكود أعلاه،"error" + 1 أحدث خطأ،استخدام ربط النصوص هو ..،مثل:

> طباعة (a .. 'b')
ab
> طباعة (157 .. 428)
157428
>

يستخدم # لقياس طول النص،وضعه أمام النص،مثل مثال التالي:

> len = "ar.oldtoolbag.com"
> طباعة طول len
14
> طباعة طول "ar.oldtoolbag.com"
14
>

table (الجدول)

في Lua،إنشاء table يتم من خلال "عبرة بناء"،أبسط تعبير بناء هو {}،يستخدم لإنشاء table فارغ.يمكن أيضًا إضافة بعض البيانات إلى table،وإعادة تعريفه مباشرة:

-- إنشاء جدول فارغ
local tbl1 = {}
 
-- مباشرة إنشاء جدول
local tbl2 = {"apple", "pear", "orange", "grape"}

جدول Lua (table) هو في الواقع "مستودع مرتبط" (associative arrays)،ويمكن أن تكون معرفات العناصر أرقامًا أو نصوصًا.

-- ملف script_table_test.lua
a = {}
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
    print(k .. " : " .. v)
end

نتيجة تنفيذ السكربت:

$ lua table_test.lua 
key : value
10 : 33

مختلف عن اللغات الأخرى التي تستخدم 0 كبدء للعدد،في Lua،يبدأ عدد الجداول بشكل افتراضي من 1.

-- ملف script_table_test2.lua
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
    print("Key", key)
end

نتيجة تنفيذ السكربت:

$ lua table_test2.lua 
Key           1
Key           2
Key           3
Key           4

الجدول لا يكون طوله ثابتًا،يزداد طول الجدول تلقائيًا عند إضافة بيانات جديدة،وجميع الجداول التي ليست لها بداية هي nil.

-- ملف script_table_test3.lua
a3 = {}
for i = 1, 10 do
    a3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])

نتيجة تنفيذ السكربت:

$ lua table_test3.lua 
val
nil

function (وظيفة)

في Lua،الوظائف تُعتبر "قيمة من الدرجة الأولى (First-Class Value)"،والوظائف يمكن أن تكون موجودة في المتغيرات:

-- ملف script_function_test.lua
function factorial1(n)
    إذا كان n == 0
        العودة إلى 1
    else
        العودة إلى n * عامل1(n - 1)
    end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))

نتيجة تنفيذ السكربت:

$ lua function_test.lua 
120
120

يمكن للوظيفة أن تُنقل عبر معامل كوظيفة مجهولة (anonymous function):

--ملف script_test2.lua
function testFun(tab,fun)
        for k, v in pairs(tab) do
                print(fun(k,v));
        end
end
tab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)--وظيفة مجهولة
        return key.."="..val;
end
);

نتيجة تنفيذ السكربت:

$ lua function_test2.lua 
key1 = val1
key2 = val2

thread (السطر)

في Lua، البروتوكول الرئيسي هو البروتوكول (coroutine). إنه يشبه السطر (thread)، يمتلك دفترًا مستقلًا ومتغيرات محلية وإشارة إلى التعليمات، ويمكنه مشاركة المتغيرات العالمية والأشياء الأخرى مع البروتوكولات الأخرى.

الفرق بين السطر والبروتوكول: يمكن للسطر تشغيل عدة سطور في نفس الوقت، بينما يمكن للبروتوكول تشغيل سطرًا واحدًا في كل وقت، ويتوقف البروتوكول الذي يشغل حاليًا عند تعليقه (suspend).

userdata (نوع مخصص)

userdata هي نوع بيانات مخصص للمستخدم، تستخدم لتقديم نوع تم إنشاؤه بواسطة تطبيق أو مكتبة لغة C/C++، يمكن تخزين أي نوع بيانات من C/C++ (عادةً هي struct وpointer) في متغير Lua واستدعاءها.