توابع Generic
Rust از generics پشتیبانی میکند که به شما امکان میدهد الگوریتمها یا ساختارهای داده (مانند مرتبسازی یا درخت دودویی) را بر روی تایپهای استفادهشده یا ذخیرهشده تخصیص دهید.
/// Pick `even` or `odd` depending on the value of `n`. fn pick<T>(n: i32, even: T, odd: T) -> T { if n % 2 == 0 { even } else { odd } } fn main() { println!("شماره ای را انتخاب کرد: {:?}", pick(97, 222, 333)); println!("یک تاپل انتخاب کرد: {:?}", pick(28, ("سگ", 1), ("گربه", 2))); }
-
Rust تایپ T را بر اساس تایپ آرگومانها و مقدار بازگشتی استنباط میکند.
-
این شبیه به الگوهای در ++C است، اما Rust تابع generic را بلافاصله به صورت جزئی کامپایل میکند، بنابراین آن تابع باید برای تمام تایپهایی که با محدودیتها مطابقت دارند معتبر باشد. به عنوان مثال، سعی کنید تابع
pick
را طوری تغییر دهید که اگرn == 0
باشد، مقدارeven + odd
را برگرداند. حتی اگر فقط نمونهسازی تابعpick
با اعداد صحیح استفاده شود، Rust همچنان آن را نامعتبر در نظر میگیرد. اما ++C اجازه این کار را به شما میدهد. -
کد generic بر اساس محلهای فراخوانی به کد non-generic تبدیل میشود. این یک انتزاع بدون هزینه است: شما دقیقاً همان نتیجهای را دریافت میکنید که گویی ساختارهای داده را بدون انتزاع به صورت دستی کدنویسی کردهاید.