Introduction: আজকের ব্লগে আমরা Rust প্রোগ্রামিং ল্যাঙ্গুয়েজের একটি অত্যন্ত শক্তিশালী ফিচার "Match" (ম্যাচ) নিয়ে কথা বলবো। আগের পর্বে আমরা Enum (ইনাম) সম্পর্কে জেনেছিলাম। এই ভিডিওতে পিয়ুষ গর্গ শিখিয়েছেন কীভাবে সেই Enum-এর বিভিন্ন অপশন বা ভ্যারিয়েন্টের সাথে মিলিয়ে আমরা আমাদের কোডকে ভিন্ন ভিন্ন পথে চালাতে পারি। সহজ কথায়, Match হচ্ছে এমন একটা সিস্টেম যা কোনো একটা ভ্যালুর ওপর ভিত্তি করে সিদ্ধান্ত নেয় যে কোডের কোন অংশটি রান করবে। এটি অনেকটা ‘Switch Case’ এর মতো হলেও Rust-এ এটি অনেক বেশি নিরাপদ এবং স্মার্ট।
Match কন্ট্রোল ফ্লো কি?
রেফারেন্স: [00:31]
Match হলো একটি কন্ট্রোল ফ্লো কনস্ট্রাক্ট। এর কাজ হলো কোনো একটা ভ্যালুকে অনেকগুলো "প্যাটার্ন" বা শর্তের সাথে তুলনা করা। যখনই কোনো প্যাটার্ন মিলে যায়, তখন সেই প্যাটার্নের জন্য নির্দিষ্ট করা কোডটুকু কাজ করে।
সহজ উদাহরণ: পিয়ুষ এখানে একটি কয়েন সর্টিং মেশিনের (Coin Sorting Machine) উদাহরণ দিয়েছেন। ধরুন একটি মেশিনে আপনি কয়েন ফেললেন। মেশিনে বিভিন্ন সাইজের ফুটো আছে। কয়েনটি গড়িয়ে গড়িয়ে যাবে এবং প্রথম যে ফুটোতে সে ফিট হবে, সেখানেই সে পড়ে যাবে। Match অপারেটরও ঠিক এভাবেই কাজ করে।
- সহজ ব্যাখ্যা (Difficult Word - Construct): 'Construct' মানে হলো কোড লেখার একটি নির্দিষ্ট কাঠামো বা নিয়ম যা কোনো বিশেষ কাজ সম্পন্ন করে।
Match এর সাথে Enum এর ব্যবহার
রেফারেন্স: [02:44]
সাধারণত Match সবচেয়ে বেশি ব্যবহৃত হয় Enum-এর সাথে। ভিডিওতে ইউএস কয়েন (Penny, Nickel, Dime, Quarter) দিয়ে এটি বোঝানো হয়েছে।
কোড উদাহরণ:
Rust
enum Coin {
Penny,
Nickel,
Dime,
Quarter,
}
fn value_in_cents(coin: Coin) -> u8 {
match coin {
Coin::Penny => 1,
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter => 25,
}
}
কোড ব্যাখ্যা: এখানে match coin চেক করছে কয়েনটি আসলে কোনটি। যদি এটি Penny হয়, তবে ফাংশনটি ১ রিটার্ন করবে। যদি Quarter হয়, তবে ২৫ রিটার্ন করবে। এটি ইফ-এলস (if-else) এর চেয়ে অনেক বেশি পরিষ্কার এবং পড়তে সুবিধা হয়।
প্যাটার্ন বাইন্ডিং (Patterns that Bind to Values)
রেফারেন্স: [08:07]
কখনও কখনও Enum এর ভ্যারিয়েন্টের ভেতরেও ডাটা থাকে। যেমন ধরুন, প্রতিটা Quarter কয়েন কোনো একটি নির্দিষ্ট স্টেট বা রাজ্যের হতে পারে। Match ব্যবহার করে আমরা সেই ভেতরের ডাটাকেও বের করে আনতে পারি।
কোড উদাহরণ:
Rust
#[derive(Debug)]
enum UsState {
Alabama,
Alaska,
// আরও অনেক স্টেট...
}
enum Coin {
Penny,
Nickel,
Dime,
Quarter(UsState), // এখানে ডাটা হিসেবে স্টেট আছে
}
fn value_in_cents(coin: Coin) -> u8 {
match coin {
Coin::Penny => 1,
Coin::Quarter(state) => {
println!("এই কোয়ার্টারটি {:?} স্টেটের!", state);
25
},
_ => 10, // বাকি সবগুলোর জন্য ১০
}
}
কোড ব্যাখ্যা: এখানে Coin::Quarter(state) লেখার মাধ্যমে আমরা ওই ভ্যারিয়েন্টের ভেতরে থাকা 'UsState' এর ভ্যালুটা state ভেরিয়েবলে নিয়ে আসছি এবং তা প্রিন্ট করছি।
অপশন Enum এর সাথে Match (Matching with Option)
রেফারেন্স: [11:53]
Rust-এ Option<T> অনেক গুরুত্বপূর্ণ। এতে হয় কোনো ভ্যালু থাকে (Some), নাহয় থাকে না (None)। Match ব্যবহার করে আমরা খুব সহজে এই নাল (Null) ভ্যালুর সমস্যা সমাধান করতে পারি।
কোড উদাহরণ:
Rust
fn plus_one(x: Option<i32>) -> Option<i32> {
match x {
None => None,
Some(i) => Some(i + 1),
}
}
let five = Some(5);
let six = plus_one(five);
let none = plus_one(None);
আমার চিন্তা: এখানে Match আমাদের বাধ্য করছে যেন আমরা None কেও হ্যান্ডেল করি। এতে করে কোড রান করার সময় হুট করে ক্রাশ করার ভয় থাকে না।
ম্যাচ হলো এক্সজস্টিভ (Matches are Exhaustive)
রেফারেন্স: [14:32]
Rust-এ Match-এর একটি মজার নিয়ম হলো—আপনাকে সব কটি সম্ভাব্য কেস বা অপশন হ্যান্ডেল করতে হবে। আপনি যদি কোনো একটি ভ্যারিয়েন্ট বাদ দেন, তবে Rust কম্পাইলার কোডটি রান করতে দেবে না।
- সহজ ব্যাখ্যা (Difficult Word - Exhaustive): 'Exhaustive' মানে হলো সম্পূর্ণ বা সবটুকু। অর্থাৎ কোনো কিছু বাদ না রেখে সব সম্ভাবনা পূরণ করা।
ক্যাচ-অল প্যাটার্ন এবং প্লেসহোল্ডার (_)
রেফারেন্স: [16:23]
যদি আপনার কাছে ১০০টি অপশন থাকে কিন্তু আপনি শুধু ৩টি নিয়ে কাজ করতে চান, তবে বাকি ৯৭টি আলাদা করে লেখার দরকার নেই। এজন্য _ (আন্ডারস্কোর) বা কোনো ভেরিয়েবল ব্যবহার করা হয়।
কোড উদাহরণ:
Rust
let dice_roll = 9;
match dice_roll {
3 => println!("আপনি একটি টুপি পেয়েছেন!"),
7 => println!("আপনার টুপি কেড়ে নেওয়া হলো।"),
other => println!("আপনি {} ঘর সামনে এগিয়ে যান।", other),
// অথবা যদি কিছু না করতে চাই: _ => (),
}
কোড ব্যাখ্যা: এখানে ৩ এবং ৭ বাদে অন্য যেকোনো সংখ্যা আসলে other ভেরিয়েবলে জমা হবে এবং প্রিন্ট হবে। যদি আমরা ওই ভ্যালু ব্যবহার না করতে চাইতাম, তবে শুধু _ দিয়ে দিতাম।
বিশ্লেষণ ও সম্ভাবনা
আমার এনালাইসিস: ভিডিওটি থেকে বোঝা যায় যে Match অপারেটর Rust-এর টাইপ সেফটি (Type Safety) নিশ্চিত করার অন্যতম প্রধান হাতিয়ার। এটি কোডকে ভুল হওয়ার হাত থেকে রক্ষা করে।
পরামর্শ ও বিকল্প: ১. বিকল্প: যদি আপনার মাত্র একটি প্যাটার্ন হ্যান্ডেল করার দরকার হয়, তবে Match ব্যবহার না করে if let ব্যবহার করা বেশি সহজ হতে পারে (যা পরের ভিডিওতে আলোচনা করা হয়েছে)। ২. রিয়ালিটি পারসপেক্টিভ: বাস্তব জীবনে বড় বড় প্রোজেক্টে যখন অনেক জটিল কন্ডিশন থাকে, তখন Match ব্যবহার করলে কোড অনেক বেশি রিডেবল (Readable) বা পাঠযোগ্য থাকে।
যাওয়ার আগে: পিয়ুষ পরামর্শ দিয়েছেন চ্যাপ্টার ২-এর "Guess the Number" গেমটির কোড আবার দেখতে। সেখানে 'Ordering' Enum-এর সাথে Match ব্যবহার করা হয়েছিল, যা এখন আপনাদের কাছে আরও পরিষ্কার মনে হবে।
[
The match Control Flow Operator | Rust Book
Piyush Garg · 2.2K views
](http://www.youtube.com/watch?v=1q76SlnFgKc)

মন্তব্যসমূহ
একটি মন্তব্য পোস্ট করুন
আপনার সমস্যাটি কমেন্ট করে আমাদের জানান :-d