English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 | 表示执行的独立线路,用于执行协同程序 |
table | Lua 中的表(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، مثلًا، عند طباعة 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
> 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 يحتوي على قيمتين محتملتين فقط: 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
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
يُمثل النص بأحداثين من الأقواس المزدوجة أو المزدوجة الواحدة.
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 >
في 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
في 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
في Lua، البروتوكول الرئيسي هو البروتوكول (coroutine). إنه يشبه السطر (thread)، يمتلك دفترًا مستقلًا ومتغيرات محلية وإشارة إلى التعليمات، ويمكنه مشاركة المتغيرات العالمية والأشياء الأخرى مع البروتوكولات الأخرى.
الفرق بين السطر والبروتوكول: يمكن للسطر تشغيل عدة سطور في نفس الوقت، بينما يمكن للبروتوكول تشغيل سطرًا واحدًا في كل وقت، ويتوقف البروتوكول الذي يشغل حاليًا عند تعليقه (suspend).
userdata هي نوع بيانات مخصص للمستخدم، تستخدم لتقديم نوع تم إنشاؤه بواسطة تطبيق أو مكتبة لغة C/C++، يمكن تخزين أي نوع بيانات من C/C++ (عادةً هي struct وpointer) في متغير Lua واستدعاءها.