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

فهرس المكتبة

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

challenge icon

التحدي

سهل

لنَبْنِ نظام فهرس مكتبة يوضّح كيف توحّد السمات الأنواع المختلفة ضمن واجهة مشتركة! ستنشئ فهرسًا يمكن فيه للكتب والمجلات، رغم امتلاكها خصائص مختلفة، أن تصف نفسها جميعًا من خلال سمة مشتركة.

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

  • catalog.rs: عرّف سمة CatalogItem ذات الطريقة الوحيدة description التي تُرجع String. تنشئ هذه السمة العقد الذي يجب أن تفي به جميع عناصر المكتبة.
  • items.rs: أنشئ بنيتين تطبّقان سمتك. يمتلك Book حقلَي title وauthor (وكلاهما من النوع String)، بينما يمتلك Magazine حقل name (من النوع String) ورقم issue (من النوع u32). يجب أن تطبّق كل بنية CatalogItem باستخدام تنسيق وصف فريد خاص بها.
  • main.rs: استورد الوحدتين وأنشئ مثيلين من Book وMagazine باستخدام المُدخلات المقدَّمة. استدعِ طريقة description على كل عنصر واطبع النتائج.

يجب أن يتبع وصف Book هذا التنسيق:

Book: {title} by {author}

يجب أن يتبع وصف Magazine هذا التنسيق:

Magazine: {name}, Issue {issue}

على سبيل المثال، مع المُدخلات 1984 وGeorge Orwell وNature و42:

Book: 1984 by George Orwell
Magazine: Nature, Issue 42

ومع المُدخلات The Rust Book وSteve Klabnik وScience Weekly و156:

Book: The Rust Book by Steve Klabnik
Magazine: Science Weekly, Issue 156

ستتلقى أربعة مُدخلات: عنوان الكتاب، ومؤلف الكتاب، واسم المجلة، ورقم إصدار المجلة (حلّل الأخير على أنه u32).

جرّب بنفسك

mod catalog;
mod items;

use catalog::CatalogItem;
use items::{Book, Magazine};

fn main() {
    // اقرأ المدخلات
    let mut book_title = String::new();
    std::io::stdin().read_line(&mut book_title).expect("Failed to read line");
    let book_title = book_title.trim().to_string();

    let mut book_author = String::new();
    std::io::stdin().read_line(&mut book_author).expect("Failed to read line");
    let book_author = book_author.trim().to_string();

    let mut magazine_name = String::new();
    std::io::stdin().read_line(&mut magazine_name).expect("Failed to read line");
    let magazine_name = magazine_name.trim().to_string();

    let mut issue_input = String::new();
    std::io::stdin().read_line(&mut issue_input).expect("Failed to read line");
    let magazine_issue: u32 = issue_input.trim().parse().expect("Failed to parse issue number");

    // TODO: أنشئ كائن Book باستخدام book_title و book_author

    // TODO: Create a Magazine instance using magazine_name and magazine_issue

    // TODO: استدعِ description() على كل عنصر واطبع النتائج
}

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

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