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

فهرس المكتبة

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

challenge icon

التحدي

سهل

لنقم ببناء نظام فهرس للمكتبة يوضح كيف توحد السمات (traits) الأنواع المختلفة تحت واجهة مشتركة! ستقوم بإنشاء فهرس حيث يمكن للكتب والمجلات — على الرغم من اختلاف خصائصها — أن تصف نفسها جميعاً من خلال سمة مشتركة.

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

  • catalog.rs: قم بتعريف سمة CatalogItem مع طريقة واحدة تسمى description تعيد String. تحدد هذه السمة العقد الذي يجب أن تلتزم به جميع عناصر المكتبة.
  • items.rs: قم بإنشاء هيكلين (structs) ينفذان السمة الخاصة بك. الـ Book لديه title و author (كلاهما من نوع String)، بينما الـ Magazine لديها name (من نوع String) ورقم issue (من نوع u32). يجب على كل هيكل تنفيذ CatalogItem بتنسيق الوصف الفريد الخاص به.
  • main.rs: قم باستيراد كلا الوحدتين (modules) وإنشاء مثيلات من 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: إنشاء مثيل (instance) من Book باستخدام book_title و book_author

    // TODO: إنشاء مثيل (instance) من Magazine باستخدام magazine_name و magazine_issue

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

جميع دروس Object Oriented Programming