مرکزی مواد پر جائیں
ماڈیول 2 · سبق 2 از 2کورس میں 4/14~15 min
ماڈیول اسباق (2/2)

پیٹرن میچنگ، اختیار، اور نتیجہ

زنگ میں ایک انتہائی طاقتور کنٹرول فلو میکانزم ہے جسے ** پیٹرن میچنگ** کہتے ہیں۔ یہ آپ کو پیٹرن کی ایک سیریز کے ساتھ ایک قدر کا موازنہ کرنے اور کوڈ پر عمل کرنے کی اجازت دیتا ہے جس کی بنیاد پر پیٹرن میچ کرتا ہے۔

match بیان

Rust میں match بیان دوسری زبانوں میں switch جیسا ہے، لیکن بہت زیادہ طاقتور اور محفوظ ہے۔ کمپائلر اس بات کو یقینی بناتا ہے کہ میچ مکمل ہے، یعنی تمام ممکنہ معاملات کو ہینڈل کیا جانا چاہیے:

Rust
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: قدر کی عدم موجودگی کی نشاندہی کرتا ہے۔
Rust
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 ہے۔
Rust
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 میں درج کرنا ناممکن ہے۔ زنگ وائلڈ کارڈ کیریکٹر _ استعمال کرنے کی اجازت دیتا ہے تمام باقی کیسز کو پکڑنے کے لیے جن کی واضح وضاحت نہیں کی گئی ہے:

Rust
let some_u8 = 3u8;
match some_u8 {
    1 => println!("One"),
    2 => println!("Two"),
    _ => println!("Something else"), // Handles all other values
}

خود ہی آزمائیں۔

ورزش#rust.m2.l2.e1
کوششیں: 0لوڈ ہو رہا ہے…

ایک متغیر کا اعلان کریں جس کا نام 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 کوششوں کے بعد حل دستیاب ہے۔

ورزش#rust.m2.l2.e2
کوششیں: 0لوڈ ہو رہا ہے…

check_age فنکشن کو مکمل کریں تاکہ اگر عمر 18 سے زیادہ یا اس کے برابر ہو تو یہ Ok('Adult') اور دوسری صورت میں Err('Minor') لوٹائے۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

یہ فیصلہ کرنے کے لیے `اگر عمر >= 18`استعمال کریں`ٹھیک ہے ('بالغ')`یا`Err('معمولی')` واپس کرنا ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش#rust.m2.l2.e3
کوششیں: 0لوڈ ہو رہا ہے…

اسٹیٹس نامی ایک اینوم کا اعلان کریں جس میں ایکٹیو اور غیر فعال متغیرات ہوں۔ بنیادی طور پر، ویلیو Status::Active کے ساتھ ایک متغیر کرنٹ_سٹیٹس کا اعلان کریں۔ آخر میں، اگر اسٹیٹس ایکٹو ہے تو 'فعال' پرنٹ کرنے کے لیے کرنٹ_سٹیٹس پر ایک میچ اسٹیٹمنٹ استعمال کریں، یا اسٹیٹس غیر فعال ہونے پر 'غیر فعال'۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

مین سے پہلے enum کی تعریف `enum Status { Active, Inactive }`کے ساتھ کریں۔ بنیادی طور پر،`Let current_status = Status::Active;`کا استعمال کریں اور متغیرات پر`match` انجام دیں۔

3 کوششوں کے بعد حل دستیاب ہے۔