0Pricing
Lua Academy · درس

نظرة عامة على أنواع بيانات Lua

استكشف أنواع nil وboolean وnumber وstring وtable وfunction وuserdata

نظرة عامة على أنواع بيانات Lua درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.

مرحبًا بكم في Lua

Lua هي لغة برمجة نصية خفيفة وسريعة وقابلة للدمج، وتُستخدم في محركات الألعاب وخوادم الويب والأنظمة المضمّنة. قبل كتابة برامج فعلية، تحتاجون إلى فهم كيفية تمثيل Lua للبيانات.

تحتوي Lua على 8 أنواع أساسية: nil وboolean وnumber وstring وtable وfunction وuserdata وthread. تنتمي كل قيمة في Lua إلى نوع واحد فقط من هذه الأنواع.

-- Check the type of any value with type()
print(type(42))        -- number
print(type("hello"))   -- string
print(type(true))      -- boolean
print(type(nil))       -- nil

nil: غياب القيمة

تستخدم Lua القيمة nil لتمثيل العدم أو غياب القيمة. وهي القيمة الوحيدة من نوعها. وتحتوي المتغيرات التي لم تُسنَد إليها قيمة من قبل على nil تلقائيًا.

تؤدي إسناد القيمة nil إلى متغير عام إلى حذفه فعليًا. وفي الجداول، يؤدي تعيين مفتاح إلى nil إلى إزالة ذلك الإدخال بالكامل.

-- Unassigned variables are nil
print(x)          -- nil

x = 10
print(x)          -- 10

x = nil
print(x)          -- nil (variable is gone)

boolean: true وfalse

يحتوي النوع boolean على قيمتين فقط: true وfalse. قواعد اعتبار القيم صحيحة أو خاطئة في Lua بسيطة لكنها مهمة: القيمتان nil وfalse فقط تُعدّان خاطئتين. وكل ما عداهما — بما في ذلك العدد 0 والسلسلة النصية الفارغة "" — يُعدّ صحيحًا.

يختلف ذلك عن العديد من اللغات التي تعتبر 0 أو "" مساويًا للقيمة الخاطئة.

-- Lua truthiness examples
if 0 then print("0 is truthy!") end       -- prints!
if "" then print("empty str is truthy!") end -- prints!
if nil then print("nil") else print("nil is falsy") end
if false then print("false") else print("false is falsy") end

number: الأعداد الصحيحة والعشرية

يحتوي Lua 5.3+ على نوعين فرعيين من number: integer وfloat. الأعداد الصحيحة قيم دقيقة من 64 بت، بينما الأعداد العشرية تستخدم الدقة المزدوجة وفق معيار IEEE 754. أما في Lua 5.1/5.2 فجميع الأعداد من نوع double.

تميّز الدالة math.type() بين النوعين الفرعيين. ويُرجع القسمة باستخدام / عددًا عشريًا دائمًا، بينما تُرجع // (القسمة الصحيحة بالتقريب إلى الأسفل) عددًا صحيحًا عندما يكون معاملاها عددين صحيحين.

print(type(10))       -- number
print(type(10.5))     -- number
print(math.type(10))  -- integer
print(math.type(10.5))-- float
print(10 / 3)         -- 3.3333...
print(10 // 3)        -- 3  (floor division)

string: النصوص في Lua

السلاسل النصية في Lua تسلسلات غير قابلة للتغيير من البايتات. ويمكن إحاطتها بعلامتي اقتباس مفردتين أو مزدوجتين، أو باستخدام الأقواس الطويلة [[...]] للسلاسل متعددة الأسطر. تتجاهل السلاسل ذات الأقواس الطويلة محرف السطر الجديد الأول، وتحافظ على كل ما عداه حرفيًا.

تُخزَّن سلاسل Lua بطريقة interned، لذلك تشترك السلاسل المتطابقة في الذاكرة. ويُرجع معامل الطول # عدد البايتات.

local s1 = 'single quotes'
local s2 = "double quotes"
local s3 = [[multi-line
long string]]

print(#s1)           -- 13
print(type(s1))      -- string
print(s1 .. " works") -- concatenation with ..

table: الحاوية الشاملة

نوع table هو بنية البيانات المركبة الوحيدة في Lua، لكنه قوي بما يكفي لتنفيذ المصفوفات والقواميس والكائنات والمجموعات وغير ذلك. الجداول مصفوفات ترابطية: تربط المفاتيح بالقيم، ويمكن أن يكون المفتاح أي قيمة ليست nil وليست NaN.

تُنشأ الجداول باستخدام الأقواس المعقوفة {}. وتستخدم الجداول بأسلوب المصفوفات مفاتيح صحيحة تبدأ من 1.

-- Array style
local fruits = {"apple", "banana", "cherry"}
print(fruits[1])   -- apple (1-indexed!)

-- Dictionary style
local person = {name = "Alice", age = 30}
print(person.name) -- Alice
print(person["age"]) -- 30

function: قيم من الدرجة الأولى

الدوال في Lua قيم من الدرجة الأولى من النوع function. ويمكن تخزينها في المتغيرات، وتمريرها كوسائط، وإرجاعها من دوال أخرى. وهذا يجعل Lua مناسبة بطبيعتها لأنماط البرمجة الوظيفية.

يمكنكم تعريف الدوال باستخدام الكلمة المفتاحية function، أو إسناد دوال مجهولة إلى المتغيرات. والصيغتان متكافئتان.

-- Two equivalent ways to define a function
function greet(name)
  return "Hello, " .. name
end

local greet2 = function(name)
  return "Hello, " .. name
end

print(type(greet))   -- function
print(greet("Lua"))  -- Hello, Lua

userdata وthread

تمثل userdata بيانات C عشوائية تديرها التطبيقات المضيفة. لا يمكنكم إنشاء userdata باستخدام Lua الخالصة — فهي تأتي من امتدادات C أو من بيئات الدمج مثل محركات الألعاب. وتسمح لكود C بإتاحة كائنات لبرامج Lua النصية.

يمثل thread coroutines — وهي مسارات تنفيذ مستقلة لها مكدساتها الخاصة. سنستكشف coroutines في درس مخصص. في الوقت الحالي، يكفي أن تعرفوا أن coroutine.create() تُرجع قيمة من النوع thread.

-- thread type via coroutine
local co = coroutine.create(function()
  print("coroutine body")
end)

print(type(co))  -- thread

-- userdata comes from C, not creatable in pure Lua
-- type(io.stdin) == "file" is a userdata variant

استخدام type() لفحص القيم

تُرجع الدالة المضمّنة type() دائمًا سلسلة نصية تسمّي نوع وسيطها. ويفيد ذلك في البرمجة الدفاعية وتصحيح الأخطاء. ويمكنكم مقارنة النتيجة مباشرة بسلاسل أسماء الأنواع.

لاحظوا أن type(nil) تُرجع السلسلة "nil"، وليس القيمة nil نفسها. ويتيح لكم ذلك التحقق بأمان مما إذا كان المتغير يحتوي على nil دون حدوث أخطاء.

local values = {42, "hi", true, nil, {}, function() end}

-- Note: nil in table stops ipairs early
for i = 1, 3 do
  print(i, type(values[i]))
end
-- 1  number
-- 2  string
-- 3  boolean

اختلاف الأنواع عن اللغات الأخرى

إذا كنتم قادمين من JavaScript أو Python أو Java، فقد تفاجئكم بعض قواعد الأنواع في Lua. لا يوجد نوع صحيح منفصل يظهر عبر type() — فالأعداد الصحيحة والعشرية تُرجع جميعها "number". ولا تملك المصفوفات نوعًا خاصًا بها — فهي مجرد جداول. ولا توجد فئات — فالكائنات جداول تحتوي على metatables.

يساعدكم فهم هذه الاختلافات على تجنب الأخطاء الشائعة عند الانتقال بين اللغات.

-- No separate array type
local arr = {1, 2, 3}
print(type(arr))      -- table (not array!)

-- No separate integer type visible
print(type(1))        -- number
print(type(1.0))      -- number

-- math.type distinguishes
print(math.type(1))   -- integer
print(math.type(1.0)) -- float

تحقق سريع

ماذا تُرجع type(0) في Lua؟

مراجعة: نظرة عامة على أنواع بيانات Lua

لقد تعلمتم أنواع Lua الثمانية جميعها:

  • nil — غياب القيمة؛ قيمة خاطئة
  • boolean — true/false؛ القيمتان nil وfalse فقط خاطئتان
  • number — عدد صحيح أو عشري؛ استخدموا math.type() للتمييز بينهما
  • string — تسلسلات بايتات غير قابلة للتغيير؛ استخدموا .. للدمج
  • table — الحاوية الشاملة للمصفوفات والقواميس
  • function — قيم من الدرجة الأولى يمكن تخزينها في المتغيرات
  • userdata — بيانات C المتاحة في Lua
  • thread — مقابض coroutines

التالي: تعريف المتغيرات — النطاق العام في مقابل النطاق المحلي.

الأسئلة الشائعة

هل درس «نظرة عامة على أنواع بيانات Lua» مجاني؟

نعم — نص درس «نظرة عامة على أنواع بيانات Lua» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «نظرة عامة على أنواع بيانات Lua»؟

استكشف أنواع nil وboolean وnumber وstring وtable وfunction وuserdata تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟

لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «نظرة عامة على أنواع بيانات Lua»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟

نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. نظرة عامة على أنواع بيانات Lua
  2. تعريف المتغيرات في Lua
  3. المعاملات الحسابية والعلاقية
  4. الإكراه والتحويل بين الأنواع
← العودة إلى Lua Academy