تخطَّ إلى المحتوى

الأنواع العامة

الأنواع العامة تسمح لك بكتابة كود مرن يعمل مع أنواع مختلفة.

هيكل صندوق<T> {
قيمة: صحيح,
}

معاملات ثابتة (Const Generics)

Section titled “معاملات ثابتة (Const Generics)”
هيكل مصفوفة_ثابتة<ثابت ن: صحيح> {
الطول: صحيح,
}
// +T يعني تغاير
هيكل قارئ<+T> {
موقع: صحيح,
}

التغاير العكسي (Contravariant)

Section titled “التغاير العكسي (Contravariant)”
// -T يعني تغاير عكسي
هيكل كاتب<-T> {
موقع: صحيح,
}
دع قيمة_موجودة: اختياري<ص64> = بعض(42);
دع قيمة_فارغة: اختياري<ص64> = عدم;
إذا قيمة_موجودة.يوجد() {
اطبع_صحيح(قيمة_موجودة.افتح_أو(0));
}
إذا !قيمة_فارغة.يوجد() {
اطبع("القيمة فارغة");
}
دالة قسمة(أ: صحيح, ب: صحيح) -> نتيجة<صحيح, نص> {
إذا ب == 0 {
أرجع فشل("لا يمكن القسمة على صفر");
}
أرجع موافق(أ / ب);
}

الأنواع المرتبطة المعممة (GATs)

Section titled “الأنواع المرتبطة المعممة (GATs)”
سمة حاوية {
نوع عنصر<ط>; // نوع مرتبط معمم بمعامل واحد
دالة أول(&ذاتي) -> صحيح;
}
سمة محول {
نوع تحويل<أ, ب>; // نوع مرتبط معمم بمعاملين
دالة طبق(&ذاتي, قيمة: صحيح) -> صحيح;
}
هيكل صندوق {
قيمة: صحيح,
}
نفذ حاوية لـ صندوق {
نوع عنصر<ط> = صحيح;
دالة أول(&ذاتي) -> صحيح {
أرجع 42;
}
}

مثال عملي لهيكل بيانات:

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