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

خصلتیں اور خاصیت کی حدیں

خصائص اس رویے کی وضاحت کرتے ہیں جو کسی خاص قسم کے پاس ہے اور وہ دوسری اقسام کے ساتھ شیئر کر سکتی ہے۔ ہم ان طریقوں کے ایک سیٹ کی وضاحت کرنے کے لیے خصلتوں کا استعمال کر سکتے ہیں جو کسی خاص عام فعالیت یا انٹرفیس کی نمائندگی کرتے ہیں، جو کہ دوسری پروگرامنگ زبانوں کے انٹرفیس کی طرح ہے۔

خاصیت کی حد ہمیں یہ بتانے کی اجازت دیتی ہے کہ ایک عام قسم کو ایک خاص خاصیت کو نافذ کرنا چاہیے، اس بات کو یقینی بناتے ہوئے کہ مرتب کرنے کے وقت مطلوبہ طریقے دستیاب ہوں۔


ایک خاصیت کی تعریف اور نفاذ

کسی خاصیت کی وضاحت کرنے کے لیے، ہم trait کلیدی لفظ استعمال کرتے ہیں جس کے بعد ان طریقوں کے دستخط ہوتے ہیں جن کو نافذ کرنے والی اقسام کو بیان کرنا ضروری ہے:

Rust
pub trait Summary {
    fn summarize(&self) -> String;
}

کنکریٹ قسم پر کسی خاصیت کو نافذ کرنے کے لیے، ہم نحو کا استعمال کرتے ہیں impl TraitName for TypeName:

Rust
pub struct NewsArticle {
    pub headline: String,
    pub content: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}", self.headline)
    }
}

خاصیت کی حدود

عام افعال لکھتے وقت، ہم قسم کے پیرامیٹرز کو محدود کر سکتے ہیں تاکہ یہ یقینی بنایا جا سکے کہ وہ کسی خاص خصوصیت کو نافذ کرتے ہیں۔ معیاری نحو ہے <T: Trait>:

Rust
pub fn notify<T: Summary>(item: &T) {
    println!("Notification: {}", item.summarize());
}

متبادل طور پر، مزید پیچیدہ دستخطوں کے لیے، ہم where شق استعمال کر سکتے ہیں:

Rust
pub fn notify_advanced<T>(item: &T)
where
    T: Summary
{
    println!("Notification: {}", item.summarize());
}

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

مشق 1: خلاصہ خصوصیت

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

خلاصہ نام کی ایک خاصیت کی وضاحت کریں جس میں طریقہ دستخط fn summarize(&self) -> String; اس کے بعد، String قسم کے ہیڈ لائن فیلڈ کے ساتھ ایک ڈھانچہ NewsArticle کی وضاحت کریں اور اس کے لیے سمری کی خاصیت کو لاگو کریں تاکہ خلاصہ کرنے کا طریقہ ہیڈ لائن فیلڈ کی قدر واپس کرے۔

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

'Summary' خاصیت اور 'NewsArticle' ساخت کی وضاحت کریں۔ NewsArticle کے لیے `impl خلاصہ` فیلڈ`self.headline.clone()` کی کلوننگ کے ساتھ لاگو کریں۔

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

مشق 2: پرنٹ_سمری کے ساتھ خاصیت کی حد

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

پچھلی مشق کے کوڈ کی بنیاد پر، ایک عام فنکشن کی وضاحت کریں جس کا نام print_summary<T> ہے جو &T قسم کے پیرامیٹر آئٹم کو قبول کرتا ہے۔ پابند خصوصیت کا اطلاق کریں تاکہ T کو خلاصہ خصوصیت کو لاگو کرنا چاہئے۔ فنکشن کے اندر، item.summarize() کے ذریعے واپس کیے گئے نتیجے کو پرنٹ کریں۔

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

دستخط `fn print_summary<T: Summary>(item: &T)`اور`println!`کے اندر`item.summarize()` کا استعمال کریں۔

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

مشق 3: خصلتوں کا استعمال کرتے ہوئے رقبہ کا حساب کتاب

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

ایریا نامی ایک خاصیت کی وضاحت کریں طریقہ fn area(&self) -> f64; کے ساتھ۔ F64 قسم کے رداس فیلڈ پر مشتمل ایک ڈھانچہ سرکل بنائیں، اور رقبہ کا حساب لگا کر اس کے لیے ایریا کی خاصیت کو لاگو کریں (فارمولا: رداس * رداس * 3.14159)۔

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

'علاقہ' خاصیت اور 'سرکل' ساخت کی وضاحت کریں۔ دائرے کے علاقے کے فارمولے کا استعمال کرتے ہوئے `علاقہ(&خود)` کو لاگو کریں۔

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