Узагальнені функції

Rust підтримує узагальнені типи, що дозволяє абстрагувати алгоритми або структури даних (наприклад, сортування або бінарне дерево) від типів, що використовуються або зберігаються.

/// Виберіть `even` або `odd` в залежності від значення `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 частково компілює узагальнену функцію одразу, тому ця функція має бути валідною для всіх типів, що відповідають обмеженням. Наприклад, спробуйте модифікувати pick так, щоб вона повертала even + odd, якщо n == 0. Навіть якщо використовується лише екземпляр pick з цілими числами, Rust все одно вважатиме його невірним. C++ дозволить вам зробити це.

  • Узагальнений код перетворюється на не-узагальнений на основі сайтів виклику. Це абстракція з нульовою вартістю: ви отримуєте точно такий же результат, як якщо б ви написали структури даних власноруч без абстракції.