Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - طابعة Generic

جزء من قسم Object Oriented Programming في رحلة Rust على Coddy — الدرس 44 من 61.

challenge icon

التحدي

سهل

لنقم ببناء نظام إعلانات مرن يوضح قوة قيود السمات (trait bounds)! ستقوم بإنشاء سمة Printable ودالة عامة (generic function) يمكنها الإعلان عن أي نوع يطبق هذه السمة — مما يوضح كيف تعمل الأنواع العامة والسمات معًا لإنشاء كود قابل لإعادة الاستخدام وآمن من حيث النوع.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • printable.rs: قم بتعريف سمة Printable عامة مع تابع print_info يأخذ &self ويعيد String. ثم أنشئ دالة عامة تسمى announce تقبل أي نوع T يطبق Printable. يجب أن تطبع هذه الدالة Announcement: {info} حيث {info} هي نتيجة استدعاء print_info() على العنصر.
  • main.rs: أنشئ هيكلين (structs) عامين يطبقان Printable:
    • Person — مع حقل name عام (String). يجب أن يعيد print_info الخاص به Person: {name}
    • Product — مع حقول name (String) و price (f64) عامة. يجب أن يعيد print_info الخاص به Product: {name} - ${price}
    قم باستيراد وحدة printable الخاصة بك، واستخدم المدخلات لإنشاء Person و Product، ثم استدعِ announce مع كل منهما لإثبات أن دالتك العامة تعمل مع أي نوع Printable.

جمال هذا التصميم هو أن announce لا تهتم ما إذا كانت تتلقى Person أو Product أو أي نوع مستقبلي — فهي تتطلب فقط أن يوفر النوع معلومات من خلال print_info(). ويضمن قيد السمة (trait bound) ذلك في وقت التجميع (compile time).

يجب أن يظهر مخرجك كلا الإعلانين:

Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}

على سبيل المثال، مع المدخلات Alice و Laptop و 999.99:

Announcement: Person: Alice
Announcement: Product: Laptop - $999.99

ستتلقى ثلاثة مدخلات: اسم الشخص، واسم المنتج، وسعر المنتج (قم بتحليله كـ f64).

جرّب بنفسك

mod printable;

use printable::{Printable, announce};

// TODO: قم بتعريف struct عام باسم Person مع حقل name عام من نوع (String)
// قم بتنفيذ trait الـ Printable لـ Person
// يجب أن تعيد print_info القيمة "Person: {name}"

// TODO: قم بتعريف struct عام باسم Product مع حقول عامة name من نوع (String) و price من نوع (f64)
// قم بتنفيذ trait الـ 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: قم بإنشاء مثيل (instance) من Person باستخدام person_name

    // TODO: قم بإنشاء مثيل (instance) من Product باستخدام product_name و price

    // TODO: قم باستدعاء announce مع Person

    // TODO: قم باستدعاء announce مع Product
}

جميع دروس Object Oriented Programming