استخدام تعدادات الاتحاد الحرفية
جزء من قسم مقدمة إلى 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. البرامج الموجهة للإنتاج ستتحقق أولاً؛ وهنا يتيح للدوال المعرفة بالأنواع قبول مدخلات المستخدم بنظافة.
التحدي
سهلأنشئ نوع الاتحاد الحرفي 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 باستخدام ::. ثم:
- قم بـ
callللدالةmoveمع الاتجاهdirection - اطبع نتيجة
getMovementDescriptionلنفس الاتجاهdirection
جرّب بنفسك
-- اكتب الكود هنا
-- 1) عرّف النوع Direction
-- 2) اكتب move و getMovementDescription (if/elseif/else)
-- 3) اقرأ المدخل: local direction = io.read() :: Direction
-- 4) استدعِ move، ثم اطبع الوصف
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس مقدمة إلى Luau
1البدء مع Luau
ما هي Luau؟لماذا نستخدم Luau؟أول كود لك بلغة Luauفحص الأنواع وأنماط الأخطاءملخص: مقدمة إلى Luau4العمل مع الدوال
تحديد أنواع المعاملات والقيم المرجعةتحديد أنواع الدوال المجهولةالدوال التي لا ترجع شيئاًالمعاملات الاختياريةالقيم الافتراضية للمعاملاتالدوال متغيرة المعاملاتتعريف أنواع الدوالملخص: الدوال محددة الأنواع7المشروع: مدير المهام مع أنواع البيانات
المشروع: هيكل المهامدالة لإضافة تفاصيل مهمة2الأنواع الأساسية
الأنواع الأساسية: num و str و boolالنوع 'any': مخرج الطوارئالنوع 'unknown'أنواع Nil والأنواع الاختياريةاستنتاج الأنواع في التطبيق العمليتوضيحات الأنواع الصريحةملخص: تدريبات على الأنواع الأساسية5الأسماء المستعارة، الأنواع المشتركة، والأنواع المتقاطعة
الأسماء المستعارة للأنواع الأوليةأنواع الاتحاد (Union Types)التعامل مع أنواع الاتحادالأنواع اللفظية (Literal Types)أنواع التقاطع (Intersection Types)دمج الأسماء المستعارة للأنواعملخص: تجميعات الأنواع المتقدمة8التعدادات (Enums) بطريقة Luau
نمط Enum في Luauالتعدادات الرقمية باستخدام الجداولتعدادات النصوص كاتحادات (Unions)استخدام تعدادات الاتحاد الحرفيةتجميد الجداول الثابتةملخص: التعدادات (Enums) بطريقة Luau3الجداول المحددة الأنواع: المصفوفات والخرائط
المصفوفات المحددة الأنواعإضافة العناصر وقراءتهاما هو نوع الخريطة (Map)؟التصريح عن الخرائط والوصول إليهاالتكرار على الجداولالجداول متعدده الأشكالالمصفوفات المحددة الأنواع متعددة الأبعادtable.unpack والوسائط المتغيرة (Varargs)ملخص: المصفوفات والخرائط6تحديد أشكال الجداول (Typing Table Shapes)
توضيحات أشكال الجداول المضمنةأسماء مستعارة للأنواع لأشكال الجداولالخصائص الاختياريةأشكال الجداول مقابل الجداول الحرةتوسيع أشكال الجداولإضافة الدوارل إلى أشكال الجداولSelf والدوال المسبوقة بنقطتين (Colon Methods)ملخص: تعريف أشكال الجداول9الأنواع المعممة (Generics): نظرة أولى
المشكلة التي تحلها الأنواع المعممةدالة هوية معممةاستخدام دالة معممةالمصفوفات المعممةأسماء مستعارة للأنواع المعممةملخص: الدوال المعممة