ملخص - محاكاة الـ Smart Pointer
جزء من قسم Object Oriented Programming في رحلة Rust على Coddy — الدرس 58 من 61.
التحدي
سهللنقم ببناء محاكاة لمؤشر ذكي يسمى SmartBox يوضح كيفية عمل المؤشرات الذكية الفعلية في Rust تحت الغطاء! سيكون الغلاف الخاص بك عاماً (generic)، ويوفر الوصول إلى قيمته الداخلية، ويعلن تلقائياً عندما يتم تنظيفه.
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
smart_box.rs: قم بتعريف هيكل عام عام (public generic struct) باسمSmartBox<T>مع حقل واحدvalueمن النوعT. قم بتنفيذ دالة مرتبطة (associated function) باسمnewتقوم بإنشاء SmartBox وتطبع رسالة إنشاء. أضف طريقةgetتعيد مرجعاً (reference) للقيمة الداخلية. أخيراً، قم بتنفيذ سمةDropلطباعة رسالة تنظيف عندما يخرج SmartBox عن النطاق (scope).main.rs: قم باستيراد وحدة smart_box الخاصة بك واستعرض SmartBox الخاص بك مع نوعين مختلفين. أنشئSmartBox<i32>يحمل رقماً وSmartBox<String>يحمل نصاً (كلاهما من المدخلات المقدمة). اطبع القيم باستخدام طريقةgetالخاصة بك. ستظهر رسائل Drop تلقائياً عندما تخرج الصناديق عن النطاق في نهاية main.
عند إنشاء SmartBox، يجب أن يطبع:
SmartBox createdعند الوصول إلى القيمة، اطبعها بهذا التنسيق:
Value: {value}عندما يتم إسقاط (drop) SmartBox، يجب أن يطبع:
SmartBox droppedعلى سبيل المثال، مع المدخلات 42 و Hello:
SmartBox created
SmartBox created
Value: 42
Value: Hello
SmartBox dropped
SmartBox droppedلاحظ كيف يتم إنشاء كلا الصندوقين أولاً، ثم يتم الوصول إلى قيمهما، وأخيراً يتم إسقاطهما بترتيب عكسي (آخر ما تم إنشاؤه، أول ما يتم إسقاطه) عندما تنتهي دالة main.
ستتلقى مدخلين: قيمة عدد صحيح (قم بتحليلها كـ i32) وقيمة نصية.
جرّب بنفسك
mod smart_box;
use smart_box::SmartBox;
fn main() {
// قراءة المدخلات
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let number: i32 = input1.trim().parse().expect("Failed to parse number");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let text = input2.trim().to_string();
// TODO: قم بإنشاء SmartBox<i32> يحتوي على number
// TODO: قم بإنشاء SmartBox<String> يحتوي على text
// TODO: اطبع القيم باستخدام الطريقة get
// التنسيق: "Value: {value}"
// ستظهر رسائل Drop تلقائياً عند انتهاء main
}
جميع دروس 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 مع المعاملاتملخص - مشغل الوسائط