مراجعة - طابعة Generic
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 44 من 61.
التحدي
سهللنبنِ نظام إعلانات مرنًا يوضح قوة حدود السمات! ستنشئ سمة Printable وgeneric function يمكنها الإعلان عن أي نوع يطبّق هذه السمة، موضحًا كيفية عمل generics والسمات معًا لإنشاء تعليمات برمجية قابلة لإعادة الاستخدام وآمنة من حيث النوع.
ستنظّم تعليماتك البرمجية عبر ملفين:
printable.rs: Define سمةPrintablepublic معprint_infomethod تأخذ&selfوreturns قيمة من النوعString. ثم أنشئ generic function public calledannounceتقبل أي نوعTيطبّقPrintable. يجب أن تطبع هذه function القيمةAnnouncement: {info}حيث إن{info}هي result استدعاءprint_info()على العنصر.main.rs: أنشئ بنيتين public تطبّقانPrintable:Person: معnamefield public (String). يجب أن تُعيدprint_infoالخاصة بها القيمةPerson: {name}Product: معnamepublic (String) وpricepublic (f64) fields. يجب أن تُعيدprint_infoالخاصة بها القيمةProduct: {name} - ${price}
announceمع كل منهما لإثبات أن generic function تعمل مع أي نوعPrintable.
يكمن جمال هذا التصميم في أن announce لا تهتم بما إذا كانت تستقبل Person أو Product أو أي نوع مستقبلي. فهي تتطلب فقط أن يتمكن النوع من توفير المعلومات من خلال print_info(). ويضمن حد السمة ذلك في وقت الترجمة.
يجب أن يُظهر الإخراج كلا الإعلانين:
Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}على سبيل المثال، مع inputs Alice وLaptop و999.99:
Announcement: Person: Alice
Announcement: Product: Laptop - $999.99ستتلقى ثلاثة inputs: اسم الشخص، واسم المنتج، وسعر المنتج (parse باعتباره f64).
جرّب بنفسك
mod printable;
use printable::{Printable, announce};
// TODO: عرّف هيكلًا عامًا Person مع حقل name عام (String)
// نفّذ السمة Printable لـ Person
// يجب أن تُرجع print_info "Person: {name}"
// TODO: عرّف هيكلًا عامًا Product مع حقول name عام (String) و price (f64)
// نفّذ السمة Printable لـ Product
// يجب أن تُرجع print_info "Product: {name} - ${price}"
fn main() {
// اقرأ المدخلات
let mut person_name = String::new();
std::io::stdin().read_line(&mut person_name).expect("Failed to read line");
let person_name = person_name.trim().to_string();
let mut product_name = String::new();
std::io::stdin().read_line(&mut product_name).expect("Failed to read line");
let product_name = product_name.trim().to_string();
let mut price_input = String::new();
std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
let price: f64 = price_input.trim().parse().expect("Failed to parse price");
// TODO: أنشئ مثيلًا من Person باستخدام person_name
// TODO: أنشئ مثيلًا من Product باستخدام product_name و price
// TODO: استدعِ announce مع Person
// TODO: استدعِ announce مع Product
}
جميع دروس البرمجة كائنية التوجه
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point8Traits كقيود
صيغة قيود Traitsقيود متعددةجملة Whereإرجاع الأنواع باستخدام Traitsمراجعة - طابعة Generic3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت