ماڈیول اسباق (1/2)
عمومیات اور افعال
جنیرکس آپ کو لچکدار، دوبارہ قابل استعمال کوڈ لکھنے کی اجازت دیتے ہیں، مختلف ڈیٹا کی اقسام کے لیے منطق کی نقل سے گریز کرتے ہیں۔ مختلف اقسام (جیسے i32، f64، یا String) کے لئے متعدد فنکشنز یا ڈھانچے کی وضاحت کرنے کے بجائے، ہم ایک عام قسم کا پیرامیٹر استعمال کر سکتے ہیں، جو روایتی طور پر حرف T سے ظاہر ہوتا ہے۔
Rust compiler monomorphization نامی ایک عمل کا استعمال کرتے ہوئے جنرک کا انتظام کرتا ہے: تالیف کے دوران، یہ ہر کنکریٹ قسم کے لیے جنرک کوڈ کی ایک کاپی تیار کرتا ہے جو حقیقت میں استعمال ہوتی ہے۔ اس کا مطلب ہے کہ صفر رن ٹائم کارکردگی اوور ہیڈ ہے۔
عام افعال
عام فنکشن کی وضاحت کرنے کے لیے، ہم ٹائپ پیرامیٹر <T> فنکشن کے نام کے بالکل بعد اور دلیل کی فہرست سے پہلے داخل کرتے ہیں:
fn print_value<T: std::fmt::Debug>(value: T) {
println!("Value: {:?}", value);
}عام افعال میں، ہم عام قسم T استدلال کی اقسام اور واپسی کی اقسام دونوں کے لیے استعمال کر سکتے ہیں:
fn identity<T>(value: T) -> T {
value
}عام ڈھانچے
ہم لچکدار فیلڈز کی وضاحت کے لیے ڈھانچے (struct) کے اندر عام قسم کے پیرامیٹرز بھی استعمال کر سکتے ہیں:
struct KeyValuePair<K, V> {
key: K,
value: V,
}
fn main() {
let pair = KeyValuePair {
key: String::from("age"),
value: 30,
};
}عام ڈھانچے کے لیے impl بلاک میں، ہمیں impl کلیدی لفظ کے فوراً بعد ٹائپ پیرامیٹر <T> کا اعلان کرنا چاہیے تاکہ یہ ظاہر کیا جا سکے کہ ہم عام ڈھانچے پر طریقوں کو نافذ کر رہے ہیں:
struct Container<T> {
value: T,
}
impl<T> Container<T> {
fn new(value: T) -> Self {
Container { value }
}
fn value(&self) -> &T {
&self.value
}
}خود ہی آزمائیں۔
ورزش 1: نقطہ کی ساخت
Point<T> نامی ایک عام ڈھانچہ کو دو فیلڈز کے ساتھ متعین کریں: قسم T کا x اور T کی قسم y۔ مین فنکشن میں، ایک متغیر پوائنٹ کو انسٹینٹیٹ کریں جس میں پوائنٹ کی عددی اقدار x = 5 اور y = 10 ہوں، پھر point.x کی قدر پرنٹ کریں۔
اشارہ دکھائیں۔
`struct پوائنٹ<T> { x: T, y: T }`کا استعمال کرتے ہوئے ساخت کا اعلان کریں۔ اسے بنیادی طور پر فوری بنائیں اور اسے پرنٹ کرنے کے لیے`point.x` استعمال کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش 2: ایک ٹوپل کو سویپ کے ساتھ تبدیل کرنا
swap<T> کے نام سے ایک عام فنکشن لکھیں جو دو عناصر (T, T) کے ٹوپل کو قبول کرتا ہے اور ان کی پوزیشن کو الٹ کر ایک نیا ٹیپل (T, T) لوٹاتا ہے۔ مین فنکشن میں، فنکشن کو ٹوپل (1، 2) کے ساتھ کال کریں اور نتیجہ پرنٹ کریں۔
اشارہ دکھائیں۔
فنکشن کا دستخط ہونا ضروری ہے `fn swap<T>(جوڑا: (T, T)) -> (T, T)`۔ الٹ ٹپل کو `(pair.1, pair.0)` کے ساتھ لوٹائیں۔
3 کوششوں کے بعد حل دستیاب ہے۔
مشق 3: کنٹینر کی ساخت
ایک عام ڈھانچہ کنٹینر<T> کی وضاحت کریں جس میں T قسم کی ویلیو فیلڈ ہو۔ ایک نیا طریقہ وضع کرنے کے لیے ایک عام امپل بلاک لاگو کریں جو T قسم کی قدر کو قبول کرتا ہے اور کنٹینر<T> کی مثال دیتا ہے۔
اشارہ دکھائیں۔
متعلقہ طریقہ کو نافذ کرنے کے لیے `impl<T> کنٹینر<T>` کا استعمال کریں` fn new(value: T) -> Self { Container { value } }`۔
3 کوششوں کے بعد حل دستیاب ہے۔