فهرس المكتبة
جزء من قسم 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 مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت