মডিউল পাঠ (2/2)
প্যাটার্ন ম্যাচিং, বিকল্প, এবং ফলাফল
মরিচায় প্যাটার্ন ম্যাচিং নামে একটি অত্যন্ত শক্তিশালী নিয়ন্ত্রণ প্রবাহ প্রক্রিয়া রয়েছে। এটি আপনাকে প্যাটার্নের একটি সিরিজের সাথে একটি মান তুলনা করতে এবং কোন প্যাটার্নের সাথে মিলে যায় তার উপর ভিত্তি করে কোড চালানোর অনুমতি দেয়।
match বিবৃতি
মরিচা-এ match বিবৃতি অন্যান্য ভাষায় একটি switch এর মতো, কিন্তু অনেক বেশি শক্তিশালী এবং নিরাপদ৷ কম্পাইলার নিশ্চিত করে যে ম্যাচটি বিস্তৃত, যার অর্থ সমস্ত সম্ভাব্য কেস পরিচালনা করা আবশ্যক:
enum Direction {
North,
South,
East,
West,
}
let dir = Direction::East;
match dir {
Direction::North => println!("Andiamo a Nord"),
Direction::South => println!("Andiamo a Sud"),
Direction::East => println!("Andiamo a Est"),
Direction::West => println!("Andiamo a Ovest"),
}মান অনুপস্থিতি পরিচালনা করা: Option
মরিচা একটি শূন্য মানের ধারণা নেই (null বা nil)। পরিবর্তে, স্ট্যান্ডার্ড লাইব্রেরি Option<T> নামক একটি enum সংজ্ঞায়িত করে যাতে থাকতে পারে:
Some(T):Tপ্রকারের একটি মান রয়েছে।None: মানের অনুপস্থিতি নির্দেশ করে।
let x: Option<i32> = Some(5);
let y: Option<i32> = None;
match x {
Some(val) => println!("C'e un valore: {}", val),
None => println!("Nessun valore trovato"),
}পুনরুদ্ধারযোগ্য ত্রুটিগুলি পরিচালনা করা: Result
যে ক্রিয়াকলাপগুলি ব্যর্থ হতে পারে (যেমন একটি ফাইল পড়া বা একটি সংখ্যায় একটি স্ট্রিং পার্স করা), জং ব্যবহার করে Result<T, E> enum, যার দুটি রূপ রয়েছে:
Ok(T): অপারেশন সফল হয়েছে এবং এতে সফলতার মান রয়েছেT।Err(E): অপারেশন ব্যর্থ হয়েছে এবং এতে ত্রুটি রয়েছেE।
fn divide(numerator: f64, denominator: f64) -> Result<f64, String> {
if denominator == 0.0 {
Err(String::from("Divisione per zero!"))
} else {
Ok(numerator / denominator)
}
}রাস্টের কম্পাইলারকে ধন্যবাদ, আপনি Ok এর ভিতরে মান অ্যাক্সেস করার আগে আপনাকে Err কেসটি পরিচালনা করতে বাধ্য করা হয়েছে, অনেক সাধারণ রানটাইম বাগ প্রতিরোধ করে।
ওয়াইল্ডকার্ড প্যাটার্ন _
প্রচুর সংখ্যক বৈকল্পিক (যেমন পূর্ণসংখ্যার মতো) ডেটা প্রকারের সাথে কাজ করার সময়, একটি match এ সমস্ত ক্ষেত্রে তালিকাভুক্ত করা অসম্ভব। মরিচা ওয়াইল্ডকার্ড অক্ষর _ ব্যবহার করে সমস্ত অবশিষ্ট কেস ধরার অনুমতি দেয় যা স্পষ্টভাবে সংজ্ঞায়িত করা হয়নি:
let some_u8 = 3u8;
match some_u8 {
1 => println!("One"),
2 => println!("Two"),
_ => println!("Something else"), // Handles all other values
}নিজে চেষ্টা করে দেখুন
Some(42) ধারণকারী বিকল্প<i32> প্রকারের maybe_value নামের একটি ভেরিয়েবল ঘোষণা করুন। maybe_value-এ একটি ম্যাচ স্টেটমেন্ট ব্যবহার করুন: যদি এতে Some(v) প্রিন্ট থাকে 'value is: v' (println ব্যবহার করে!), যদি এতে None print 'no value' থাকে।
ইঙ্গিত দেখান
একটি `match maybe_value { Some(v) => println!('value is: {}', v), None => println!('no value') }` ব্লক লিখুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
চেক_এজ ফাংশনটি সম্পূর্ণ করুন যাতে এটি 18 বছরের বেশি বা সমান হলে ঠিক আছে ('প্রাপ্তবয়স্ক') এবং অন্যথায় ত্রুটি ('মাইনর') প্রদান করে।
ইঙ্গিত দেখান
`ঠিক আছে ('প্রাপ্তবয়স্ক')`বা`Err('নাবালক')`ফিরবেন কিনা তা সিদ্ধান্ত নিতে`যদি বয়স >= 18` ব্যবহার করুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
সক্রিয় এবং নিষ্ক্রিয় ভেরিয়েন্ট ধারণকারী স্ট্যাটাস নামের একটি enum ঘোষণা করুন। প্রধানত, Status::Active মান সহ একটি পরিবর্তনশীল current_status ঘোষণা করুন। পরিশেষে, স্থিতি সক্রিয় থাকলে 'সক্রিয়' প্রিন্ট করতে বর্তমান_স্থিতিতে একটি ম্যাচ বিবৃতি ব্যবহার করুন, অথবা যদি স্থিতি নিষ্ক্রিয় হয় তবে 'নিষ্ক্রিয়'।
ইঙ্গিত দেখান
এনাম স্ট্যাটাস { সক্রিয়, নিষ্ক্রিয় }` দিয়ে প্রধানের আগে enum সংজ্ঞায়িত করুন। প্রধানভাবে, `চলুন*বর্তমান*স্থিতি = স্থিতি::সক্রিয়;`ব্যবহার করুন এবং ভেরিয়েন্টে`ম্যাচ` সম্পাদন করুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ