المسارات
/
Cairo
Cairo
/
التمارين
/
عوالم الزمن: تسلسل الزمن
عوالم الزمن: تسلسل الزمن

عوالم الزمن: تسلسل الزمن

تمرين تعلّمي

مقدمة

المؤشرات الذكية في Cairo هي هياكل بيانات متقدمة تضمن إدارة آمنة وفعّالة للذاكرة من خلال إضافة ميزات أمان إلى المؤشرات العادية، فتمنع المشكلات الشائعة مثل إلغاء الإشارة إلى مؤشر فارغ أو الوصول إلى ذاكرة غير مُهيّأة.

ما هو المؤشر الذكي؟

يتصرف المؤشر الذكي مثل المؤشر العادي، لكنه يتتبع الملكية ويضمن الوصول الآمن إلى الذاكرة، فيمنع مشكلات مثل إلغاء الإشارة إلى مؤشر فارغ أو معلّق.

أنواع المؤشرات الذكية

يوفر Cairo عدة أنواع من المؤشرات الذكية، مثل Box<T> وNullable<T>:

  • Box<T>: يخزّن البيانات في مقطع ذاكرة خاص، وهو مثالي للبيانات الكبيرة أو ذات الحجم الديناميكي. ويتيح نقل الملكية دون نسخ البيانات.
  • Nullable<T>: يشير إما إلى قيمة صالحة من النوع T أو إلى null، وهو مفيد للتعامل مع القيم الاختيارية.

أمان الذاكرة

تساعد المؤشرات الذكية على منع الوصول غير الآمن إلى الذاكرة، وتضمن تحرير الذاكرة تلقائيًا عند عدم الحاجة إليها، ما يقلل من خطر تسرب الذاكرة.

مثال: استخدام Box<T> مع الأنواع العودية

تتيح المؤشرات الذكية مثل Box<T> التعامل الآمن مع الأنواع العودية، كما في الشجرة الثنائية، عبر تخصيص الذاكرة بكفاءة وتجنب العودية اللانهائية.

use core::box::{BoxTrait};

#[derive(Copy, Drop)]
enum BinaryTree {
    Leaf: u32,
    Node: (u32, Box<BinaryTree>, Box<BinaryTree>),
}

fn main() {
    let leaf1 = BinaryTree::Leaf(1);
    let leaf2 = BinaryTree::Leaf(2);
    let node = BinaryTree::Node((3, BoxTrait::new(leaf1), BoxTrait::new(leaf2)));
    println!("{:?}", node);
}

مزايا الأداء

تحسّن المؤشرات الذكية الأداء عبر تمرير مراجع إلى البيانات بدلًا من نسخ هياكل كبيرة، ما يقلل من عبء الذاكرة.

// `Cart` is a large struct that contains a lot of information
fn pass_pointer(cart: Box<Cart>) {
    let cart = cart.unbox();
    println!("{} is shopping today and bought {} items", cart.buyer, cart.items);
}

التعليمات

في Chrono Realms، لا يقتصر تعامل Time Keepers على أشجار الخطوط الزمنية فحسب، بل يمتد إلى Chrono Chains، وهي تسلسلات من عقد TimeNode مترابطة، يمثّل كل منها لحظة محددة في الزمن. وChrono Chain هو مسار مستقيم من لحظات متتالية، ترتبط فيه كل TimeNode بالتالية. وتفيد Chrono Chains عند التنقل عبر تسلسل من أحداث محددة، إذ تتيح لهم متابعة خط زمني واحد.

غير أن Time Keepers، للتعامل مع Chrono Chains الطويلة المحتملة، يستخدمون المؤشرات الذكية (Box<T>) لإدارتها والتنقل فيها بأمان من دون التسبب في تكرار غير ضروري للذاكرة أو تجاوز سعتها. وكل TimeNode تحمل مرجعًا إلى العقدة التالية، ما يشكّل بنية تعاودية.

ومهمتك بوصفك متدربًا هي تنفيذ Chrono Chain كبنية قائمة تعاودية باستخدام المؤشرات الذكية.

في هذا التمرين، ستقوم بما يلي:

  1. إنشاء enum تعاودي باسم ChronoChain يمثّل قائمة من اللحظات.
  2. استخدام المؤشر الذكي Box<T> لتخزين العقد التعاودية.
  3. تنفيذ دالة لإنشاء ChronoChain من مصفوفة من قيم u32.
  4. تنفيذ دالة للتنقل في ChronoChain وجمع القيم المخزنة في القائمة.

1. تعريف enum التعاودي ChronoChain

أنشئ enum تعاوديًا باسم ChronoChain له بديلان:

  • End: يمثّل نهاية القائمة.
  • Link: يحتوي على قيمة u32 ومرجع مغلَّف بـBox إلى العقدة التالية في التسلسل.

2. إنشاء دالة لبناء ChronoChain

اكتب دالة ChronoChain::build تأخذ مصفوفة من قيم u32 وتُرجع ChronoChain، مع ربط القيم تسلسليًا باستخدام المؤشرات الذكية.

3. تنفيذ دالة الجمع

اكتب دالة ChronoChain::sum للتنقل تعاوديًا في ChronoChain وجمع قيم جميع العقد.

مثال على الاستخدام

fn main() {
    // Create a ChronoChain from an array of values
    let chrono_chain = ChronoChain::build(array![10, 20, 30]);

    // Sum the values in the ChronoChain
    let total_sum = chrono_chain.sum();

    println!("Total Time Power: {}", total_sum);
}
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Cairo Exercism

مستعد لبدء عوالم الزمن: تسلسل الزمن؟

سجّل في Exercism لتتعلّم وتتقن Cairo عبر 25 مفهومًا68 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.