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