Trait Bounds

هنگام کار با generic‌ها، معمولاً می‌خواهید نیاز داشته باشید که تایپ، trait ترید خاص را پیاده‌سازی کنند، تا بتوانید متدهای آن trait را فراخوانی کنید.

You can do this with T: Trait:

fn duplicate<T: Clone>(a: T) -> (T, T) {
    (a.clone(), a.clone())
}

// struct NotClonable;

fn main() {
    let foo = String::from("foo");
    let pair = duplicate(foo);
    println!("{pair:?}");
}
This slide should take about 8 minutes.
  • سعی کنید یک NonClonable بسازید و آن را به duplicate پاس دهید.

  • زمانی که چندین ترید لازم است، از + برای ترکیب آن‌ها استفاده کنید.

  • یک عبارت where را نشان دهید، زیرا دانش‌آموزان هنگام خواندن کد با آن مواجه خواهند شد.

    fn duplicate<T>(a: T) -> (T, T)
    where
        T: Clone,
    {
        (a.clone(), a.clone())
    }
    • اگر تعداد پارامترها زیاد باشد، استفاده از عبارت where باعث می‌شود که امضای تابع مرتب‌تر و خواناتر باشد.
    • این ویژگی‌های اضافی دارد که آن را قدرتمندتر می‌کند.
      • اگر کسی بپرسد، ویژگی اضافی این است که تایپ در سمت چپ : می‌تواند دلخواه باشد، مانند <Option<T.
  • توجه داشته باشید که Rust (هنوز) پشتیبانی از ویژه‌سازی را ندارد. به عنوان مثال، با توجه به duplicate اصلی، اضافه کردن یک پیاده‌سازی ویژه‌شده مانند duplicate(a: u32) نامعتبر است.