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

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