توابع 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)));
}
This slide should take about 5 minutes.
  • Rust تایپ T را بر اساس تایپ آرگومان‌ها و مقدار بازگشتی استنباط می‌کند.

  • این شبیه به الگوهای در ++C است، اما Rust تابع generic را بلافاصله به صورت جزئی کامپایل می‌کند، بنابراین آن تابع باید برای تمام تایپ‌هایی که با محدودیت‌ها مطابقت دارند معتبر باشد. به عنوان مثال، سعی کنید تابع pick را طوری تغییر دهید که اگر n == 0 باشد، مقدار even + odd را برگرداند. حتی اگر فقط نمونه‌سازی تابع pick با اعداد صحیح استفاده شود، Rust همچنان آن را نامعتبر در نظر می‌گیرد. اما ++C اجازه این کار را به شما می‌دهد.

  • کد generic بر اساس محل‌های فراخوانی به کد non-generic تبدیل می‌شود. این یک انتزاع بدون هزینه است: شما دقیقاً همان نتیجه‌ای را دریافت می‌کنید که گویی ساختارهای داده را بدون انتزاع به صورت دستی کدنویسی کرده‌اید.