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