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

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

جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 44 من 61.

challenge icon

التحدي

سهل

لنبنِ نظام إعلانات مرنًا يوضح قوة حدود السمات! ستنشئ سمة Printable وgeneric function يمكنها الإعلان عن أي نوع يطبّق هذه السمة، موضحًا كيفية عمل generics والسمات معًا لإنشاء تعليمات برمجية قابلة لإعادة الاستخدام وآمنة من حيث النوع.

ستنظّم تعليماتك البرمجية عبر ملفين:

  • printable.rs: Define سمة Printable ‏public مع print_info method تأخذ &self وreturns قيمة من النوع String. ثم أنشئ generic function ‏public called announce تقبل أي نوع T يطبّق Printable. يجب أن تطبع هذه function القيمة Announcement: {info} حيث إن {info} هي result استدعاء print_info() على العنصر.
  • main.rs: أنشئ بنيتين public تطبّقان Printable:
    • Person: مع name field ‏public (String). يجب أن تُعيد print_info الخاصة بها القيمة Person: {name}
    • Product: مع name ‏public (String) وprice ‏public (f64) fields. يجب أن تُعيد print_info الخاصة بها القيمة Product: {name} - ${price}
    استورد printable module، واستخدم inputs لإنشاء Person وProduct، ثم استدعِ 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
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Rust عبر الإنترنت