فهرس المكتبة
جزء من قسم Object Oriented Programming في رحلة Rust على Coddy — الدرس 60 من 61.
التحدي
سهللنقم ببناء نظام فهرس للمكتبة يوضح كيف توحد السمات (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
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائط