دیتا تایپ‌های Generic

می‌توانید از generic‌ ها برای انتزاع نوع فیلد مشخص استفاده کنید:

#[derive(Debug)]
struct Point<T> {
    x: T,
    y: T,
}

impl<T> Point<T> {
    fn coords(&self) -> (&T, &T) {
        (&self.x, &self.y)
    }

    fn set_x(&mut self, x: T) {
        self.x = x;
    }
}

fn main() {
    let integer = Point { x: 5, y: 10 };
    let float = Point { x: 1.0, y: 4.0 };
    println!("{integer:?} و {float:?}");
    println!("coords: {:?}", integer.coords());
}
This slide should take about 10 minutes.
  • سوال: چرا T در عبارت {}<impl<T> Point<T دوبار مشخص شده است؟ آیا این تکراری نیست؟

    • این به این دلیل است که این یک بخش پیاده‌سازی generic برای تایپ generic است. آن‌ها به‌طور مستقل generic هستند.
    • این به این معناست که این متدها برای هر نوع T تعریف شده‌اند.
    • این امکان وجود دارد که { .. }<impl Point<u32 را بنویسید.
      • Point هنوز هم generic است و می‌توانید از <Point<f64 استفاده کنید، اما متدهای موجود در این بلوک تنها برای <Point<u32 در دسترس خواهند بود.
  • سعی کنید یک متغیر جدید با let p = Point { x: 5, y: 10.0 }; بسازید. کد را به‌روزرسانی کنید تا نقاطی که دارای عناصر با تایپ‌های مختلف هستند را مجاز کند، با استفاده از دو تایپ متغیر، مانند T و U.