ماڈیول اسباق (2/2)
پیٹرن میچنگ، اختیار، اور نتیجہ
زنگ میں ایک انتہائی طاقتور کنٹرول فلو میکانزم ہے جسے ** پیٹرن میچنگ** کہتے ہیں۔ یہ آپ کو پیٹرن کی ایک سیریز کے ساتھ ایک قدر کا موازنہ کرنے اور کوڈ پر عمل کرنے کی اجازت دیتا ہے جس کی بنیاد پر پیٹرن میچ کرتا ہے۔
match بیان
Rust میں 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> نامی ایک اینوم کی وضاحت کرتی ہے جس میں یہ شامل ہوسکتا ہے:
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
ایسے آپریشنز کے لیے جو ناکام ہو سکتے ہیں (جیسے فائل کو پڑھنا یا کسی نمبر میں سٹرنگ کو پارس کرنا)، Rust 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)
}
}Rust کے کمپائلر کی بدولت، آپ کو Err کیس کو ہینڈل کرنے پر مجبور کیا جاتا ہے اس سے پہلے کہ آپ Ok کے اندر کی قدر تک رسائی حاصل کر سکیں، بہت سے عام رن ٹائم بگس کو روکتے ہوئے
وائلڈ کارڈ پیٹرن _
اعداد و شمار کی اقسام کے ساتھ کام کرتے وقت جن میں بڑی تعداد میں متغیرات ہوتے ہیں (جیسے عدد)، تمام کیسز کو match میں درج کرنا ناممکن ہے۔ زنگ وائلڈ کارڈ کیریکٹر _ استعمال کرنے کی اجازت دیتا ہے تمام باقی کیسز کو پکڑنے کے لیے جن کی واضح وضاحت نہیں کی گئی ہے:
let some_u8 = 3u8;
match some_u8 {
1 => println!("One"),
2 => println!("Two"),
_ => println!("Something else"), // Handles all other values
}خود ہی آزمائیں۔
ایک متغیر کا اعلان کریں جس کا نام maybe_value of type Option<i32> ہے جس میں Some(42) شامل ہیں۔ maybe_value پر ایک مماثلت کا بیان استعمال کریں: اگر اس میں Some(v) پرنٹ ہے 'value is: v' (println کا استعمال کرتے ہوئے!)، اگر اس میں None پرنٹ 'کوئی قدر نہیں' ہے۔
اشارہ دکھائیں۔
ایک `match maybe_value { Some(v) => println!('value is: {}', v), None => println!('no value') }` بلاک لکھیں۔
3 کوششوں کے بعد حل دستیاب ہے۔
check_age فنکشن کو مکمل کریں تاکہ اگر عمر 18 سے زیادہ یا اس کے برابر ہو تو یہ Ok('Adult') اور دوسری صورت میں Err('Minor') لوٹائے۔
اشارہ دکھائیں۔
یہ فیصلہ کرنے کے لیے `اگر عمر >= 18`استعمال کریں`ٹھیک ہے ('بالغ')`یا`Err('معمولی')` واپس کرنا ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
اسٹیٹس نامی ایک اینوم کا اعلان کریں جس میں ایکٹیو اور غیر فعال متغیرات ہوں۔ بنیادی طور پر، ویلیو Status::Active کے ساتھ ایک متغیر کرنٹ_سٹیٹس کا اعلان کریں۔ آخر میں، اگر اسٹیٹس ایکٹو ہے تو 'فعال' پرنٹ کرنے کے لیے کرنٹ_سٹیٹس پر ایک میچ اسٹیٹمنٹ استعمال کریں، یا اسٹیٹس غیر فعال ہونے پر 'غیر فعال'۔
اشارہ دکھائیں۔
مین سے پہلے enum کی تعریف `enum Status { Active, Inactive }`کے ساتھ کریں۔ بنیادی طور پر،`Let current_status = Status::Active;`کا استعمال کریں اور متغیرات پر`match` انجام دیں۔
3 کوششوں کے بعد حل دستیاب ہے۔