Menu
CoddyTech

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

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

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

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

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

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

داخل الدالة، عالج الأعضاء بشكل شامل باستخدام سلسلة if/elseif. بما أن النوع يقيّد الإدخال بأربع قيم، فإن التحقق من ثلاث منها وترك الأخيرة لـ 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()، يكون نوعها string عاديًا، لأن مدقّق الأنواع لا يستطيع معرفة ما سيكتبه المستخدم. يعالج عامل التحويل النوعي في Luau، ::، ذلك: فكتابة value :: Type تخبر مدقّق الأنواع أن يتعامل مع القيمة على أنها من ذلك النوع. يتناول درس تأكيدات الأنواع قرب نهاية هذا القسم التحويلات النوعية بالتفصيل؛ أما الآن، فيكفي سطر واحد:

local direction = io.read() :: Direction

التحويل النوعي وعدٌ وليس تحققًا؛ فلا شيء يفحص الإدخال أثناء التشغيل. يتحقق كود الإنتاج من الإدخال أولًا؛ أما هنا، فيتيح للدوال ذات الأنواع المحددة قبول إدخال المستخدم بسلاسة.

challenge icon

التحدي

سهل

حوِّل الاتجاه الذي يكتبه اللاعب إلى إجراء.

  1. اكتب type Direction = "up" | "down" | "left" | "right".
  2. اكتب local function getAction(direction: Direction): string بحيث تُرجع "Climb" أو "Drop" أو "Turn left" أو "Turn right".
  3. اقرأ local direction = io.read() :: Direction واطبع getAction(direction).

اضغط على Run Code: عند إدخال up، يظهر الناتج Climb.

جرّب بنفسك

-- 1) النوع Direction
-- 2) getAction(direction: Direction): string
-- 3) local direction = io.read() :: Direction، ثم اطبع الإجراء

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

تدرّب بنفسك: مترجم Luau عبر الإنترنت