الأنواع العامة
الأنواع العامة (Generics)
Section titled “الأنواع العامة (Generics)”الأنواع العامة تسمح لك بكتابة كود مرن يعمل مع أنواع مختلفة.
هيكل عام بسيط
Section titled “هيكل عام بسيط”هيكل صندوق<T> { قيمة: صحيح,}معاملات ثابتة (Const Generics)
Section titled “معاملات ثابتة (Const Generics)”هيكل مصفوفة_ثابتة<ثابت ن: صحيح> { الطول: صحيح,}التباين (Variance)
Section titled “التباين (Variance)”التغاير (Covariant)
Section titled “التغاير (Covariant)”// +T يعني تغايرهيكل قارئ<+T> { موقع: صحيح,}التغاير العكسي (Contravariant)
Section titled “التغاير العكسي (Contravariant)”// -T يعني تغاير عكسيهيكل كاتب<-T> { موقع: صحيح,}النوع الاختياري العام
Section titled “النوع الاختياري العام”دع قيمة_موجودة: اختياري<ص64> = بعض(42);دع قيمة_فارغة: اختياري<ص64> = عدم;
إذا قيمة_موجودة.يوجد() { اطبع_صحيح(قيمة_موجودة.افتح_أو(0));}
إذا !قيمة_فارغة.يوجد() { اطبع("القيمة فارغة");}نوع النتيجة العام
Section titled “نوع النتيجة العام”دالة قسمة(أ: صحيح, ب: صحيح) -> نتيجة<صحيح, نص> { إذا ب == 0 { أرجع فشل("لا يمكن القسمة على صفر"); } أرجع موافق(أ / ب);}الأنواع المرتبطة المعممة (GATs)
Section titled “الأنواع المرتبطة المعممة (GATs)”سمة حاوية { نوع عنصر<ط>; // نوع مرتبط معمم بمعامل واحد دالة أول(&ذاتي) -> صحيح;}
سمة محول { نوع تحويل<أ, ب>; // نوع مرتبط معمم بمعاملين دالة طبق(&ذاتي, قيمة: صحيح) -> صحيح;}
هيكل صندوق { قيمة: صحيح,}
نفذ حاوية لـ صندوق { نوع عنصر<ط> = صحيح; دالة أول(&ذاتي) -> صحيح { أرجع 42; }}القائمة المرتبطة
Section titled “القائمة المرتبطة”مثال عملي لهيكل بيانات:
هيكل عقدة { قيمة: صحيح, التالي: صحيح, // مؤشر للعقدة التالية}
دالة أنشئ_عقدة(ق: صحيح) -> عقدة { أرجع عقدة { قيمة: ق, التالي: 0, };}المثال الكامل
Section titled “المثال الكامل”// هيكل عامهيكل صندوق<T> { قيمة: صحيح,}
// معاملات ثابتةهيكل مصفوفة_ثابتة<ثابت ن: صحيح> { الطول: صحيح,}
// تباينهيكل قارئ<+T> { موقع: صحيح,}
هيكل كاتب<-T> { موقع: صحيح,}
// عقدة قائمةهيكل عقدة { قيمة: صحيح, التالي: صحيح,}
دالة أنشئ_عقدة(ق: صحيح) -> عقدة { أرجع عقدة { قيمة: ق, التالي: 0, };}
دالة رئيسية() -> صحيح { اطبع("=== الأنواع العامة ===");
// الأنواع العامة اطبع("تم تعريف صندوق<T>"); اطبع("تم تعريف مصفوفة_ثابتة<ثابت ن: صحيح>");
// التباين اطبع("تم تعريف قارئ<+T> (covariant)"); اطبع("تم تعريف كاتب<-T> (contravariant)");
// قائمة مرتبطة اطبع("=== قائمة مرتبطة ==="); دع عقدة1 = أنشئ_عقدة(10); دع عقدة2 = أنشئ_عقدة(20); دع عقدة3 = أنشئ_عقدة(30);
اطبع("العقد:"); اطبع_صحيح(عقدة1.قيمة); اطبع_صحيح(عقدة2.قيمة); اطبع_صحيح(عقدة3.قيمة);
// اختياري اطبع("=== اختياري<صحيح> ==="); دع قيمة_موجودة: اختياري<ص64> = بعض(42); دع قيمة_فارغة: اختياري<ص64> = عدم;
إذا قيمة_موجودة.يوجد() { اطبع("القيمة موجودة:"); اطبع_صحيح(قيمة_موجودة.افتح_أو(0)); }
إذا !قيمة_فارغة.يوجد() { اطبع("القيمة الثانية فارغة"); }
أرجع 0;}