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)نامعتبر است.