Cairo में स्मार्ट पॉइंटर उन्नत डेटा स्ट्रक्चर हैं। ये साधारण पॉइंटर में सुरक्षा की सुविधाएँ जोड़कर मेमोरी का सुरक्षित और कुशल प्रबंधन सुनिश्चित करते हैं। इससे null पॉइंटर को डीरेफरेंस करने या बिना इनिशियलाइज़ की गई मेमोरी तक पहुँचने जैसी आम समस्याएँ रुक जाती हैं।
स्मार्ट पॉइंटर साधारण पॉइंटर की तरह ही काम करता है, लेकिन यह ओनरशिप पर नज़र रखता है और मेमोरी तक सुरक्षित पहुँच सुनिश्चित करता है। इससे null या डैंगलिंग पॉइंटर को डीरेफरेंस करने जैसी समस्याएँ नहीं होतीं।
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 से भी काम पड़ता है। Chrono Chain जुड़े हुए TimeNodes का क्रम होता है, जिनमें हर TimeNode समय के किसी एक खास पल को दर्शाता है।
एक Chrono Chain एक के बाद एक आने वाले पलों का सीधा रास्ता होता है, जिसमें हर TimeNode अगले नोड से जुड़ता है।
जब Time Keepers को किसी खास घटनाओं के क्रम से गुज़रना होता है, तब इन Chrono Chains से बहुत मदद मिलती है, क्योंकि इनसे वे एक ही टाइमलाइन पर चल सकते हैं।
लेकिन इन Chrono Chains को, जो काफी लंबी हो सकती हैं, संभालने के लिए Time Keepers स्मार्ट पॉइंटर (Box<t>)</t> का इस्तेमाल करते हैं। इससे वे पलों के इन ऐरे को सुरक्षित तरीके से संभाल पाते हैं और उन पर एक-एक करके चल पाते हैं, जिससे मेमोरी की अनावश्यक नकल या ओवरफ्लो नहीं होता।
हर TimeNode अगले नोड का रेफरेंस अपने अंदर रखता है, जिससे एक रिकर्सिव स्ट्रक्चर बनता है।
एक शिष्य के रूप में आपको स्मार्ट पॉइंटर की मदद से एक Chrono Chain को रिकर्सिव ऐरे स्ट्रक्चर के रूप में लागू करना है।
इस अभ्यास में आप यह सब करेंगे:
ChronoChain एनम बनाइए, जो पलों के एक ऐरे को दर्शाता है।Box<T> स्मार्ट पॉइंटर का इस्तेमाल कीजिए।u32 वैल्यू के एक ऐरे से एक ChronoChain बनाने वाला फंक्शन लागू कीजिए।ChronoChain पर एक-एक करके चलकर उसमें रखी वैल्यू का जोड़ निकालने वाला फंक्शन लागू कीजिए।ChronoChain एनम को परिभाषित कीजिएदो वेरिएंट वाला एक रिकर्सिव एनम ChronoChain बनाइए:
End: ऐरे के अंत को दर्शाता है।Link: इसमें एक u32 वैल्यू और चेन में अगले नोड का बॉक्स में रखा हुआ रेफरेंस रहता है।एक फंक्शन 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 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।