কায়রোর স্মার্ট পয়েন্টার হলো উন্নত ডেটা স্ট্রাকচার, যেগুলো সাধারণ পয়েন্টারে নিরাপত্তার বৈশিষ্ট্য যোগ করে নিরাপদ ও দক্ষ মেমরি ম্যানেজমেন্ট নিশ্চিত করে এবং নাল পয়েন্টার ডিরেফারেন্স করা বা আনইনিশিয়ালাইজড মেমরি অ্যাক্সেস করার মতো কমন সমস্যা প্রতিরোধ করে।
একটি স্মার্ট পয়েন্টার সাধারণ পয়েন্টারের মতোই আচরণ করে, তবে এটি ওনারশিপ ট্র্যাক করে ও নিরাপদ মেমরি অ্যাক্সেস নিশ্চিত করে, ফলে নাল বা ড্যাঙ্গলিং পয়েন্টার ডিরেফারেন্স করার মতো সমস্যা এড়ানো যায়।
কায়রো কয়েক ধরনের স্মার্ট পয়েন্টার দেয়, যেমন 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 নিয়েও কাজ করেন, অর্থাৎ লিঙ্কড TimeNodes-এর সিকোয়েন্স, যেখানে প্রতিটি TimeNode সময়ের একটি নির্দিষ্ট মুহূর্ত নির্দেশ করে। একটি Chrono Chain হলো ক্রমানুসারী মুহূর্তের একটি সরল পথ, যেখানে প্রতিটি TimeNode পরবর্তীটির সাথে সংযুক্ত থাকে। এই Chrono Chains নির্দিষ্ট কিছু ইভেন্টের সিরিজের মধ্য দিয়ে ভ্রমণ করার সময় কাজে লাগে, কারণ এগুলো Time Keepers-কে একটি একক টাইমলাইন অনুসরণ করার সুযোগ দেয়।
তবে এই সম্ভাব্য দীর্ঘ Chrono Chains সামলাতে Time Keepers স্মার্ট পয়েন্টার (Box<t>)</t> ব্যবহার করেন, যাতে অপ্রয়োজনীয় মেমরি ডুপ্লিকেশন বা ওভারফ্লো ছাড়াই নিরাপদে মুহূর্তের এই অ্যারেগুলো ব্যবস্থাপনা ও ট্রাভার্স করতে পারেন। প্রতিটি TimeNode পরবর্তী নোডের একটি রেফারেন্স ধারণ করে, যা একটি রিকার্সিভ স্ট্রাকচার তৈরি করে।
শিক্ষানবিশ হিসেবে আপনার কাজ হলো স্মার্ট পয়েন্টার ব্যবহার করে একটি Chrono Chain কে রিকার্সিভ অ্যারে স্ট্রাকচার হিসেবে ইমপ্লিমেন্ট করা।
এই অনুশীলনীতে আপনি:
ChronoChain enum তৈরি করুন, যা মুহূর্তের একটি অ্যারে প্রতিনিধিত্ব করে।Box<T> স্মার্ট পয়েন্টার ব্যবহার করুন।u32 মানের একটি অ্যারে থেকে একটি ChronoChain তৈরি করার একটি ফাংশন ইমপ্লিমেন্ট করুন।ChronoChain ট্রাভার্স করে অ্যারেতে সংরক্ষিত মানগুলো যোগ করার একটি ফাংশন ইমপ্লিমেন্ট করুন।ChronoChain enum ডিফাইন করুনদুটি ভ্যারিয়েন্ট সহ একটি রিকার্সিভ enum ChronoChain তৈরি করুন:
End: অ্যারের শেষ নির্দেশ করে।Link: একটি u32 মান এবং চেইনের পরবর্তী নোডের একটি বক্সড রেফারেন্স ধারণ করে।এমন একটি ফাংশন ChronoChain::build লিখুন যা u32 মানের একটি অ্যারে নেয় এবং স্মার্ট পয়েন্টার ব্যবহার করে মানগুলো ক্রমানুসারে লিঙ্ক করে একটি ChronoChain রিটার্ন করে।
ChronoChain রিকার্সিভভাবে ট্রাভার্স করে সব নোডের মান যোগ করার জন্য একটি ফাংশন ChronoChain::sum লিখুন।
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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।