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

السمات

السمات تُشبه الواجهات في لغات أخرى. تُحدد سلوكاً مشتركاً يمكن لأنواع مختلفة تنفيذه.

سمة قابل_للحساب {
دالة قيمة(&ذاتي) -> ص64;
}
هيكل نقطة {
س: ص64,
ص: ص64,
}
نفذ قابل_للحساب لـ نقطة {
دالة قيمة(&ذاتي) -> ص64 {
أرجع ذاتي.س + ذاتي.ص;
}
}
دع نق = نقطة { س: 10, ص: 20 };
دع الناتج = نق.قيمة(); // 30
اطبع_صحيح(الناتج);

تنفيذ نفس السمة لأنواع مختلفة

Section titled “تنفيذ نفس السمة لأنواع مختلفة”
سمة قابل_للحساب {
دالة قيمة(&ذاتي) -> ص64;
}
// النقطة
هيكل نقطة {
س: ص64,
ص: ص64,
}
نفذ قابل_للحساب لـ نقطة {
دالة قيمة(&ذاتي) -> ص64 {
أرجع ذاتي.س + ذاتي.ص;
}
}
// العداد
هيكل عداد {
قيمة: ص64,
}
نفذ قابل_للحساب لـ عداد {
دالة قيمة(&ذاتي) -> ص64 {
أرجع ذاتي.قيمة * 2;
}
}

يمكن لهيكل تنفيذ عدة سمات:

سمة قابل_للطباعة {
دالة اطبع(&ذاتي);
}
سمة قابل_للمقارنة {
دالة يساوي(&ذاتي, آخر: &ذاتي) -> منطقي;
}

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

Section titled “الأنواع المرتبطة (Associated Types)”

يمكن للسمة تعريف أنواع مرتبطة:

سمة قابل_للتحويل {
نوع ناتج;
دالة حول(&ذاتي) -> صحيح;
}
هيكل نقطة {
س: صحيح,
ص: صحيح,
}
نفذ قابل_للتحويل لـ نقطة {
نوع ناتج = صحيح;
دالة حول(&ذاتي) -> صحيح {
أرجع 7;
}
}

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

Section titled “الأنواع المرتبطة المعممة (GATs)”
سمة حاوية {
نوع عنصر<ط>;
دالة أول(&ذاتي) -> صحيح;
}
هيكل صندوق_أرقام {
قيمة: صحيح,
}
نفذ حاوية لـ صندوق_أرقام {
نوع عنصر<ط> = صحيح;
دالة أول(&ذاتي) -> صحيح {
أرجع 42;
}
}
سمة محول {
نوع تحويل<أ, ب>;
دالة طبق(&ذاتي, قيمة: صحيح) -> صحيح;
}
هيكل مضاعف {
عامل: صحيح,
}
نفذ محول لـ مضاعف {
نوع تحويل<أ, ب> = صحيح;
دالة طبق(&ذاتي, قيمة: صحيح) -> صحيح {
أرجع قيمة * 3;
}
}
## المثال الكامل
```knoz
// سمة للحساب
سمة قابل_للحساب {
دالة قيمة(&ذاتي) -> ص64;
}
// هيكل نقطة
هيكل نقطة {
س: ص64,
ص: ص64,
}
نفذ قابل_للحساب لـ نقطة {
دالة قيمة(&ذاتي) -> ص64 {
أرجع ذاتي.س + ذاتي.ص;
}
}
// هيكل عداد
هيكل عداد {
قيمة: ص64,
}
نفذ قابل_للحساب لـ عداد {
دالة قيمة(&ذاتي) -> ص64 {
أرجع ذاتي.قيمة * 2;
}
}
دالة رئيسية() -> صحيح {
اطبع("=== السمات ===");
// إنشاء نقطة
دع نق = نقطة { س: 10, ص: 20 };
اطبع("مجموع النقطة (10+20): ");
اطبع_صحيح(نق.قيمة());
// إنشاء عداد
دع عد = عداد { قيمة: 50 };
اطبع("ضعف العداد (50*2): ");
اطبع_صحيح(عد.قيمة());
// مجموع القيم
دع مجموع = نق.قيمة() + عد.قيمة();
اطبع("المجموع الكلي: ");
اطبع_صحيح(مجموع);
أرجع 0;
}