ماڈیول اسباق (2/2)
خصلتیں اور خاصیت کی حدیں
خصائص اس رویے کی وضاحت کرتے ہیں جو کسی خاص قسم کے پاس ہے اور وہ دوسری اقسام کے ساتھ شیئر کر سکتی ہے۔ ہم ان طریقوں کے ایک سیٹ کی وضاحت کرنے کے لیے خصلتوں کا استعمال کر سکتے ہیں جو کسی خاص عام فعالیت یا انٹرفیس کی نمائندگی کرتے ہیں، جو کہ دوسری پروگرامنگ زبانوں کے انٹرفیس کی طرح ہے۔
خاصیت کی حد ہمیں یہ بتانے کی اجازت دیتی ہے کہ ایک عام قسم کو ایک خاص خاصیت کو نافذ کرنا چاہیے، اس بات کو یقینی بناتے ہوئے کہ مرتب کرنے کے وقت مطلوبہ طریقے دستیاب ہوں۔
ایک خاصیت کی تعریف اور نفاذ
کسی خاصیت کی وضاحت کرنے کے لیے، ہم trait کلیدی لفظ استعمال کرتے ہیں جس کے بعد ان طریقوں کے دستخط ہوتے ہیں جن کو نافذ کرنے والی اقسام کو بیان کرنا ضروری ہے:
pub trait Summary {
fn summarize(&self) -> String;
}کنکریٹ قسم پر کسی خاصیت کو نافذ کرنے کے لیے، ہم نحو کا استعمال کرتے ہیں impl TraitName for TypeName:
pub struct NewsArticle {
pub headline: String,
pub content: String,
}
impl Summary for NewsArticle {
fn summarize(&self) -> String {
format!("{}", self.headline)
}
}خاصیت کی حدود
عام افعال لکھتے وقت، ہم قسم کے پیرامیٹرز کو محدود کر سکتے ہیں تاکہ یہ یقینی بنایا جا سکے کہ وہ کسی خاص خصوصیت کو نافذ کرتے ہیں۔ معیاری نحو ہے <T: Trait>:
pub fn notify<T: Summary>(item: &T) {
println!("Notification: {}", item.summarize());
}متبادل طور پر، مزید پیچیدہ دستخطوں کے لیے، ہم where شق استعمال کر سکتے ہیں:
pub fn notify_advanced<T>(item: &T)
where
T: Summary
{
println!("Notification: {}", item.summarize());
}خود ہی آزمائیں۔
مشق 1: خلاصہ خصوصیت
خلاصہ نام کی ایک خاصیت کی وضاحت کریں جس میں طریقہ دستخط fn summarize(&self) -> String; اس کے بعد، String قسم کے ہیڈ لائن فیلڈ کے ساتھ ایک ڈھانچہ NewsArticle کی وضاحت کریں اور اس کے لیے سمری کی خاصیت کو لاگو کریں تاکہ خلاصہ کرنے کا طریقہ ہیڈ لائن فیلڈ کی قدر واپس کرے۔
اشارہ دکھائیں۔
'Summary' خاصیت اور 'NewsArticle' ساخت کی وضاحت کریں۔ NewsArticle کے لیے `impl خلاصہ` فیلڈ`self.headline.clone()` کی کلوننگ کے ساتھ لاگو کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
مشق 2: پرنٹ_سمری کے ساتھ خاصیت کی حد
پچھلی مشق کے کوڈ کی بنیاد پر، ایک عام فنکشن کی وضاحت کریں جس کا نام print_summary<T> ہے جو &T قسم کے پیرامیٹر آئٹم کو قبول کرتا ہے۔ پابند خصوصیت کا اطلاق کریں تاکہ T کو خلاصہ خصوصیت کو لاگو کرنا چاہئے۔ فنکشن کے اندر، item.summarize() کے ذریعے واپس کیے گئے نتیجے کو پرنٹ کریں۔
اشارہ دکھائیں۔
دستخط `fn print_summary<T: Summary>(item: &T)`اور`println!`کے اندر`item.summarize()` کا استعمال کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
مشق 3: خصلتوں کا استعمال کرتے ہوئے رقبہ کا حساب کتاب
ایریا نامی ایک خاصیت کی وضاحت کریں طریقہ fn area(&self) -> f64; کے ساتھ۔ F64 قسم کے رداس فیلڈ پر مشتمل ایک ڈھانچہ سرکل بنائیں، اور رقبہ کا حساب لگا کر اس کے لیے ایریا کی خاصیت کو لاگو کریں (فارمولا: رداس * رداس * 3.14159)۔
اشارہ دکھائیں۔
'علاقہ' خاصیت اور 'سرکل' ساخت کی وضاحت کریں۔ دائرے کے علاقے کے فارمولے کا استعمال کرتے ہوئے `علاقہ(&خود)` کو لاگو کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔