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