مراجعة - طابعة Generic
جزء من قسم Object Oriented Programming في رحلة Rust على Coddy — الدرس 44 من 61.
التحدي
سهللنقم ببناء نظام إعلانات مرن يوضح قوة قيود السمات (trait bounds)! ستقوم بإنشاء سمة Printable ودالة عامة (generic function) يمكنها الإعلان عن أي نوع يطبق هذه السمة — مما يوضح كيف تعمل الأنواع العامة والسمات معًا لإنشاء كود قابل لإعادة الاستخدام وآمن من حيث النوع.
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
printable.rs: قم بتعريف سمةPrintableعامة مع تابعprint_infoيأخذ&selfويعيدString. ثم أنشئ دالة عامة تسمىannounceتقبل أي نوعTيطبقPrintable. يجب أن تطبع هذه الدالةAnnouncement: {info}حيث{info}هي نتيجة استدعاءprint_info()على العنصر.main.rs: أنشئ هيكلين (structs) عامين يطبقانPrintable:Person— مع حقلnameعام (String). يجب أن يعيدprint_infoالخاص بهPerson: {name}Product— مع حقولname(String) وprice(f64) عامة. يجب أن يعيدprint_infoالخاص بهProduct: {name} - ${price}
announceمع كل منهما لإثبات أن دالتك العامة تعمل مع أي نوعPrintable.
جمال هذا التصميم هو أن announce لا تهتم ما إذا كانت تتلقى Person أو Product أو أي نوع مستقبلي — فهي تتطلب فقط أن يوفر النوع معلومات من خلال print_info(). ويضمن قيد السمة (trait bound) ذلك في وقت التجميع (compile time).
يجب أن يظهر مخرجك كلا الإعلانين:
Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}على سبيل المثال، مع المدخلات Alice و Laptop و 999.99:
Announcement: Person: Alice
Announcement: Product: Laptop - $999.99ستتلقى ثلاثة مدخلات: اسم الشخص، واسم المنتج، وسعر المنتج (قم بتحليله كـ f64).
جرّب بنفسك
mod printable;
use printable::{Printable, announce};
// TODO: قم بتعريف struct عام باسم Person مع حقل name عام من نوع (String)
// قم بتنفيذ trait الـ Printable لـ Person
// يجب أن تعيد print_info القيمة "Person: {name}"
// TODO: قم بتعريف struct عام باسم Product مع حقول عامة name من نوع (String) و price من نوع (f64)
// قم بتنفيذ trait الـ Printable لـ Product
// يجب أن تعيد print_info القيمة "Product: {name} - ${price}"
fn main() {
// قراءة المدخلات
let mut person_name = String::new();
std::io::stdin().read_line(&mut person_name).expect("Failed to read line");
let person_name = person_name.trim().to_string();
let mut product_name = String::new();
std::io::stdin().read_line(&mut product_name).expect("Failed to read line");
let product_name = product_name.trim().to_string();
let mut price_input = String::new();
std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
let price: f64 = price_input.trim().parse().expect("Failed to parse price");
// TODO: قم بإنشاء مثيل (instance) من Person باستخدام person_name
// TODO: قم بإنشاء مثيل (instance) من Product باستخدام product_name و price
// TODO: قم باستدعاء announce مع Person
// TODO: قم باستدعاء announce مع Product
}
جميع دروس Object Oriented Programming
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point8Traits كقيود
صيغة قيود Traitsقيود متعددةجملة Whereإرجاع الأنواع باستخدام Traitsمراجعة - طابعة Generic3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائط