المؤشرات الذكية في 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 كبنية قائمة تعاودية باستخدام المؤشرات الذكية.
في هذا التمرين، ستقوم بما يلي:
enum تعاودي باسم ChronoChain يمثّل قائمة من اللحظات.Box<T> لتخزين العقد التعاودية.ChronoChain من مصفوفة من قيم u32.ChronoChain وجمع القيم المخزنة في القائمة.enum التعاودي ChronoChain
أنشئ enum تعاوديًا باسم ChronoChain له بديلان:
End: يمثّل نهاية القائمة.Link: يحتوي على قيمة u32 ومرجع مغلَّف بـBox إلى العقدة التالية في التسلسل.ChronoChain
اكتب دالة ChronoChain::build تأخذ مصفوفة من قيم u32 وتُرجع ChronoChain، مع ربط القيم تسلسليًا باستخدام المؤشرات الذكية.
اكتب دالة 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);
}
سجّل في Exercism لتتعلّم وتتقن Cairo عبر 25 مفهومًا68 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.