Avatar ·

متى تستخدم النوع المرتبط (associated type) ومتى تستخدم المعامل العام (generic parameter) في Rust؟

مرحباً بالجميع! بدأت تعلم Rust وواجهت صعوبة: لا أستطيع فهم متى يجب استخدام الأنواع المرتبطة (associated types) ومتى يجب استخدام المعاملات العامة العادية (generics). على سبيل المثال، أكتب trait لمكرر (iterator) أو مجموعة (collection). إذا أردت أن يكون للهيكل (struct) نوع عنصر، يمكنني القيام بذلك: ```rust trait MyIterator { fn next(&mut self) -> Option; } ``` أو هكذا: ```rust trait MyIterator { type Item; fn next(&mut self) -> Option; } ``` يبدو أن كلا الخيارين يعملان، لكنني سمعت أن هناك فرقاً في كيفية تطبيقهما عملياً. ليس واضحاً تماماً بالنسبة لي: متى يجب أن أختار طريقة ومتى أخرى؟ مثال محدد: أكتب trait للأشكال الهندسية التي لها مساحة. كل شكل قد يكون له نوع خاص به لتمثيل الإحداثيات (مثل `f32`، `f64` أو حتى أعداد صحيحة). إذا جعلت `trait Shape`، فسأضطر إلى تحديد النوع في كل مكان. أما إذا جعلت `tra