Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

استخدام تعدادات الاتحاد الحرفية

جزء من قسم مقدمة إلى Luau في رحلة Lua على Coddy — الدرس 54 من 73.

تثبت اتحاد الحرفيات (Literal unions) قيمتها كـ معاملات للدوال (function parameters). عند تحديد نوع المعامل باستخدام اتحاد الحرفيات، يضمن الفاحص (checker) أن الدالة لا يتم استدعاؤها إلا باستخدام عضو صالح فقط:

type Direction = "up" | "down" | "left" | "right"

local function move(direction: Direction)
    print(`Moving {direction}...`)
end

move("left")  -- ✓
move("north") -- ✗ خطأ نوع: ليس Direction

داخل الدالة، تعامل مع الأعضاء بشكل شامل (exhaustively) باستخدام سلسلة if/elseif. نظرًا لأن النوع يحدد الـ input بأربع قيم فقط، فإن التحقق من ثلاث قيم وترك else للقيم الأخيرة يغطي كل شيء:

local function describe(direction: Direction): string
    if direction == "up" then
        return "Going upward"
    elseif direction == "down" then
        return "Going downward"
    elseif direction == "left" then
        return "Turning left"
    else
        return "Turning right"
    end
end

تعقيد بسيط واحد: النصوص التي تأتي من الخارج — مثل io.read() — يتم تصنيف نوعها كـ plain string، لأن الفاحص لا يمكنه معرفة ما سيكتبه المستخدم. تحويل النوع (cast) باستخدام :: الذي تعلمته سابقًا يخبره بمعاملة القيمة كنوع الـ enum الخاص بك:

local direction = io.read() :: Direction

تحويل النوع (cast) هو وعد وليس تحققًا — في وقت التشغيل لا شيء يتحقق من الـ input. البرامج الموجهة للإنتاج ستتحقق أولاً؛ وهنا يتيح للدوال المعرفة بالأنواع قبول مدخلات المستخدم بنظافة.

challenge icon

التحدي

سهل

أنشئ نوع الاتحاد الحرفي Direction بالأعضاء "up"، "down"، "left" و "right".

أنشئ دالة move تأخذ direction: Direction وتطبع Moving [direction]...

أنشئ دالة getMovementDescription تأخذ direction: Direction، وتعيد string، وتتعامل مع كل عضو باستخدام if/elseif/else:

  • "up"Going upward
  • "down"Going downward
  • "left"Turning left
  • "right"Turning right

اقرأ سطرًا واحدًا من المستخدم باستخدام io.read() وقم بعمل cast له إلى Direction باستخدام ::. ثم:

  1. قم بـ call للدالة move مع الاتجاه direction
  2. اطبع نتيجة getMovementDescription لنفس الاتجاه direction

جرّب بنفسك

-- اكتب الكود هنا
-- 1) عرّف النوع Direction
-- 2) اكتب move و getMovementDescription (if/elseif/else)
-- 3) اقرأ المدخل: local direction = io.read() :: Direction
-- 4) استدعِ move، ثم اطبع الوصف
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس مقدمة إلى Luau