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