unsafe Rust ব্যবহার করে একটি ডাবলি লিংকড লিস্ট লিখুন, যার মধ্যে থাকবে লিস্টের উপর একটি ইটারেটর আর দক্ষ মিউটেশনের জন্য একটি কার্সর।
ডাবলি লিংকড লিস্ট কম্পিউটার সায়েন্সের একটি মৌলিক ডেটা স্ট্রাকচার।
ডাবলি লিংকড লিস্টের প্রতিটি নোডে থাকে ডেটা, আর পরের ও আগের নোড থাকলে সেগুলোর দিকে পয়েন্টার।
লিস্টের যেকোনো জায়গায় দক্ষভাবে নতুন নোড যোগ করা যায়, যদি ওই অবস্থানের একটি রেফারেন্স আগে থেকেই থাকে। একইভাবে, অন্য একটি লিস্টের সব এলিমেন্ট ধ্রুবক সময়ে যেকোনো জায়গায় ঢোকানো যায়।
Rust-এ লিংকড লিস্ট খুব কমই ব্যবহার করা হয়, তবে মাঝে মাঝে নতুন শেখা কেউ যখন একটি বানাতে যায়, তখন এটাই তাকে হোঁচট খাওয়ায়। অনেক সময় অপরিচিত বরো চেকারের সাথে কাজ করতে গিয়ে তারা অপ্রত্যাশিতভাবে কঠিন সমস্যায় পড়ে।
unsafe নিয়ে একটি নোটমনে রাখবেন, unsafe Rust-এর লক্ষ্য হলো এমন ক্ষেত্রে সেফ কোড লেখা, যেখানে কম্পাইলার আমাদের সঠিকতা নিশ্চিত করতে সাহায্য করতে পারে না। আমরা যে সেফ ইন্টারফেসগুলো প্রকাশ করি, শুধু সেগুলো ব্যবহার করে একজন ব্যবহারকারীর পক্ষে যেন কোনোভাবেই মেমরি-অসেফটি ঘটানো সম্ভব না হয়।
আপনার যে সেফটি-ক্রিটিক্যাল ইনভ্যারিয়েন্টগুলো রক্ষা করতে হবে, সেগুলো ডকুমেন্ট করুন, আর প্রতিটি unsafe ব্লকে কমেন্ট করে জানান কেন এটি সেফ। যে ফাংশনে কলারকে সেফটি-ক্রিটিক্যাল ইনভ্যারিয়েন্ট বজায় রাখতে হয়, সেটিকে unsafe হিসেবে চিহ্নিত করা উচিত। এর মধ্যে প্রাইভেট ফাংশনও পড়ে।
সামনে ও পেছনে এলিমেন্ট যোগ ও মুছে ফেলার (পুশ ও পপ) কার্যকারিতা ইমপ্লিমেন্ট করুন। এতটুকুই যথেষ্ট লিস্টটিকে একটি ডাবল-এন্ডেড কিউ হিসেবে ব্যবহার করার জন্য। এছাড়াও len ও is_empty ফাংশন দুইটি ইমপ্লিমেন্ট করুন।
চূড়ান্ত ইমপ্লিমেন্টেশনে লিস্টের সব পরিবর্তন কার্সর স্ট্রাক্টের মাধ্যমে করা উচিত, যাতে কোডের পুনরাবৃত্তি কম হয়। LinkedList-এর push_* ও pop_* মেথডগুলো pre_implemented মডিউলে প্রয়োজনীয় কার্সর মেথডগুলোর ভিত্তিতে সংজ্ঞায়িত করা আছে। আপনি চাইলে এখনকার জন্য Cursor স্ট্রাক্ট বাদ দিয়ে মেথডগুলো ওভাররাইড করতে পারেন, তবে শেষে সেগুলো আগের অবস্থায় ফিরিয়ে দিন।
Iter স্ট্রাক্ট দিয়ে সামনে থেকে পেছনে লিস্টের উপর ইটারেশন ইমপ্লিমেন্ট করুন।
কার্সরের কার্যকারিতা সম্পূর্ণ করুন। এটি যেকোনো অবস্থানে যেতে পারবে এবং সেখানে এলিমেন্ট ঢোকাতে বা মুছতে পারবে।
রিসোর্স পরিষ্কার করার জন্য আপনার LinkedList-এর উপর Drop ট্রেইট ইমপ্লিমেন্ট করুন।
শেষের এই দুইটি জিনিসের টেস্ট শর্তসাপেক্ষে কম্পাইল করা হয় advanced ফিচার ফ্ল্যাগের মাধ্যমে। এগুলো চালু করতে Cargo.toml ফাইলে [features] অংশে গিয়ে default = ["advanced"] কী-টি যোগ করুন।
আপনার স্ট্রাকচারের ব্যবহারকারীদের সর্বোচ্চ নমনীয়তা দিতে নিশ্চিত করুন যে আপনার LinkedList<T> টাইপটি T-এর সাপেক্ষে কোভ্যারিয়েন্ট। এর মানে হলো, উদাহরণস্বরূপ, একটি LinkedList<&'static T> কে LinkedList<&'a T> হিসেবেও ব্যবহার করা যায়। Rust-এ ভ্যারিয়েন্সের ব্যাখ্যার জন্য Rustonomicon দেখুন।
নিশ্চিত করুন যে আপনার লিস্টটি থ্রেডের সীমানা পেরিয়ে পাঠানো ও শেয়ার করা নিরাপদ, আর ম্যানুয়ালি Send ও Sync ইমপ্লিমেন্ট করে টাইপ সিস্টেমকে সেটি জানান। এই ট্রেইটগুলো সাধারণত স্বয়ংক্রিয়ভাবে ডিরাইভ হয়, কিন্তু র' পয়েন্টার ব্যবহারের কারণে এখানে সেগুলো স্বয়ংক্রিয়ভাবে ইমপ্লিমেন্ট হয় না। এগুলোর তাৎপর্য সম্পর্কে বিস্তারিত জানতে Send ও Sync এর ডকুমেন্টেশন দেখুন এবং সেগুলো নিয়ে Rustonomicon-এর অধ্যায় পড়ুন।
Exercism-এ সাইন আপ করুন, Rust ট্র্যাকের 99টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।