রাস্টে iterators হল একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা ডেটা সংগ্রহ বা কাস্টম কালেকশনগুলোর উপাদানগুলো একে একে প্রক্রিয়া করার জন্য ব্যবহার করা হয়। এটি মূলত একটি অবজেক্ট হিসেবে কাজ করে যা পরবর্তী উপাদানটি আনতে পারে এবং সেই উপাদানটি প্রক্রিয়া করার জন্য একটি অ্যাক্সেস প্রদান করে। এর মাধ্যমে কাস্টম কালেকশন বা ডেটা স্ট্রাকচারের উপাদানগুলোতে সহজেই ট্রাভার্স করা যায়।
এই টিউটোরিয়ালে, আমরা কীভাবে একটি কাস্টম কালেকশন (যেমন একটি কাস্টম struct) তৈরি করতে পারি এবং তার উপাদানগুলোকে iterators ব্যবহার করে ট্রাভার্স (অনুসন্ধান) করতে পারি, তা দেখবো।
Custom Collection তৈরি করা
প্রথমে আমরা একটি কাস্টম কালেকশন তৈরি করব যা Book নামক একটি struct ব্যবহার করবে। এর মধ্যে একটি ভেক্টর (vector) থাকবে যা বইয়ের নামগুলি ধারণ করবে।
struct BookCollection {
books: Vec<String>,
}
impl BookCollection {
fn new() -> Self {
BookCollection { books: Vec::new() }
}
fn add_book(&mut self, book: String) {
self.books.push(book);
}
}এখানে, BookCollection একটি কাস্টম কালেকশন যা বইয়ের নামগুলো ধারণ করে। add_book মেথডটি নতুন বই যোগ করার জন্য ব্যবহার করা হয়।
Iterator Trait ইমপ্লিমেন্ট করা
একটি কালেকশনের উপাদানগুলোতে ট্রাভার্স করতে আমরা রাস্টের Iterator trait ইমপ্লিমেন্ট করব। এর মাধ্যমে, আমরা একটি next() মেথড প্রদান করতে পারব যা পরবর্তী উপাদানটি ফেরত দেবে।
impl Iterator for BookCollection {
type Item = String;
fn next(&mut self) -> Option<Self::Item> {
self.books.pop()
}
}এখানে, Iterator trait এর মাধ্যমে next() মেথডে বইয়ের তালিকা থেকে একটি বই পপ করা হবে। এটি একটি Option টাইপ ফেরত দেবে। Some(book) যদি কোনো বই থাকে এবং None যদি তালিকা ফাঁকা হয়।
Custom Collection এর Iterator ব্যবহার করা
এখন আমরা আমাদের কাস্টম কালেকশনের উপাদানগুলো ট্রাভার্স (অনুসন্ধান) করতে একটি for লুপ ব্যবহার করব, যেটি iterator এর মাধ্যমে বইয়ের নামগুলো একে একে প্রদর্শন করবে।
fn main() {
let mut collection = BookCollection::new();
collection.add_book("The Rust Programming Language".to_string());
collection.add_book("The Pragmatic Programmer".to_string());
collection.add_book("Clean Code".to_string());
// Iterating over the collection using a for loop
for book in collection {
println!("{}", book);
}
}এখানে for লুপটি collection নামক কাস্টম কালেকশনের উপর কাজ করে, যা Iterator trait ইমপ্লিমেন্ট করেছে। এটি একটি একে একে বইয়ের নামগুলো প্রিন্ট করবে যতক্ষণ না তালিকা ফাঁকা হয়।
ব্যবহারকারীর নিজের Iterator মেথড তৈরি করা
রাস্টে আপনি Iterator trait ইমপ্লিমেন্ট করার সময় নিজের মেথডও তৈরি করতে পারেন, যেগুলি কাস্টম কালেকশনগুলির উপর ট্রাভার্স চালাতে সাহায্য করবে। নিচে একটি কাস্টম filter_books মেথড দেখানো হচ্ছে, যা একটি নির্দিষ্ট শব্দ দিয়ে বই ফিল্টার করবে।
impl BookCollection {
fn filter_books<'a>(&'a self, keyword: &'a str) -> impl Iterator<Item = &str> {
self.books.iter().filter(move |&book| book.contains(keyword))
}
}এখানে, filter_books মেথডটি একটি Iterator ফেরত দেয় যা শুধুমাত্র সেই বইগুলোকে নির্বাচিত করে যেগুলোর নামের মধ্যে নির্দিষ্ট keyword রয়েছে।
অগ্রসর Iterator ব্যবহার করা
রাস্টের Iterator ট্রেইটগুলির মধ্যে বিভিন্ন ধরনের ইনবিল্ট মেথড রয়েছে, যেগুলি ব্যবহার করে বিভিন্ন ধরনের ট্রাভার্সাল কাজ করা সম্ভব। কিছু উদাহরণ:
- map: প্রতি উপাদানের উপর কোনো ফাংশন প্রয়োগ করে।
- filter: একটি শর্তে উপাদানগুলো ফিল্টার করে।
- collect: সব উপাদানগুলোকে নতুন একটি কালেকশনে সংগ্রহ করে।
fn main() {
let mut collection = BookCollection::new();
collection.add_book("The Rust Programming Language".to_string());
collection.add_book("The Pragmatic Programmer".to_string());
collection.add_book("Clean Code".to_string());
// Using map to modify the data while iterating
let uppercase_books: Vec<String> = collection
.books
.iter()
.map(|book| book.to_uppercase())
.collect();
for book in uppercase_books {
println!("{}", book);
}
}এখানে, map মেথডের মাধ্যমে আমরা প্রতিটি বইয়ের নামকে বড় হাতের অক্ষরে পরিণত করেছি এবং তারপর collect মেথড দিয়ে তা একটি নতুন Vec<String> কালেকশনে রূপান্তরিত করেছি।
সারাংশ
রাস্টে Iterators ব্যবহারের মাধ্যমে কাস্টম কালেকশনগুলোর উপাদানগুলো খুব সহজে ট্রাভার্স (অনুসন্ধান) করা যায়। আপনি Iterator trait ইমপ্লিমেন্ট করে আপনার কাস্টম কালেকশনের উপাদানগুলো অ্যাক্সেস করতে পারেন এবং রাস্টের বিভিন্ন iterator method ব্যবহার করে একাধিক কার্যক্রম করতে পারেন, যেমন ফিল্টার, ম্যাপ, এবং সংগ্রহ। এটা একটি খুবই শক্তিশালী এবং সুশৃঙ্খল পদ্ধতি ডেটা পরিচালনার জন্য।