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

الأنواع اللفظية (Literal Types)

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

تسمح الأنواع مثل string بأي النص any — ولكن في بعض الأحيان تكون قيم معينة محددة فقط هي الصحيحة. ينشئ **النوع الحرفي** (literal type) نوعًا باستخدام القيمة نفسها:

local mode: "dark" = "dark"   -- يُسمح فقط بالسلسلة "dark"
local locked: true = true      -- يُسمح فقط بالقيمة المنطقية true

بمفردها، قد تبدو الأنواع ذات القيمة الواحدة مجرد حالة خاصة. لكن عند دمجها مع اتحادات الأنواع (unions)، تتوفر واحدة من أكثر الأدوات فائدة في Luau — وهي مجموعة محددة بدقة من الـ values الـ allowed:

type Direction = "north" | "south" | "east" | "west"
type GameState = "menu" | "playing" | "paused" | "gameover"

local move: Direction = "north"     -- ✓
local state: GameState = "playing"  -- ✓
-- local bad: Direction = "diagonal" -- ✗ خطأ في النوع!

الآن، أي خطأ إملائي مثل "nort" أو قيمة غير صالحة مثل "diagonal" يتم اكتشافه أثناء التحرير — بينما مع نوع string العادي كانت ستمر القيمة دون اكتشاف وتتسبب في error أثناء التشغيل.

تتميز الأنواع الحرفية بأنها **حساسة لحالة الأحرف** وتطابق القيمة بدقة: "North" لا تطابق "north". تُعد النصوص الحرفية هي الحالة الأكثر شيوعًا، ولكن الـ boolean والأعداد الحرفية (في إصدارات Luau الأحدث) تعمل بنفس الطريقة. هذا النمط — وهو union من النصوص الحرفية — هو أيضًا الطريقة التي تستبدل بها Luau التعدادات (enums) الموجودة في اللغات الأخرى، كما ستلاحظ في فصل لاحق.

challenge icon

التحدي

سهل

أنشئ ثلاثة أسماء مستعارة لأنواع الاتحاد المباشر (literal-union type aliases):

  • Direction = "north" | "south" | "east" | "west"
  • GameState = "menu" | "playing" | "paused" | "gameover"
  • Difficulty = "easy" | "medium" | "hard"

قم بـ declare، باستخدام الأسماء المستعارة:

  • playerDirection: Direction = "north"
  • currentState: GameState = "playing"
  • selectedDifficulty: Difficulty = "medium"

أنشئ function باسم movePlayer(direction: Direction): string تُرجع "Moving [direction]"، و function باسم updateGameState(state: GameState): string تُرجع "Game state: [state]".

اطبع print، كل منها في سطر مستقل:

  1. movePlayer(playerDirection)
  2. updateGameState(currentState)
  3. قيمة selectedDifficulty

جرّب بنفسك

-- اكتب الكود هنا
-- type Direction / GameState / Difficulty كـ literal unions
-- أعلن عن playerDirection, currentState, selectedDifficulty
-- movePlayer(direction: Direction): string -> "Moving [direction]"
-- updateGameState(state: GameState): string -> "Game state: [state]"
-- اطبع النتائج الثلاث
quiz iconاختبر نفسك

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

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

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