Обобщения позволяют обобщить типы и функциональность для более общих случаев. Они чрезвычайно полезны благодаря уменьшению дублирования кода, однако могут привести к сравнительному усложнению синтаксиса. А именно, использование обобщений требует особого внимания при определении допустимых реальных типов которыми могут заменяться обобщённые. Наиболее простым и распространённым применением обобщений является обобщение параметров типа.
Обобщить параметр типа можно используя угловые скобки и верхний верблюжий регистр:
Например, объявление обобщённой функции foo принимающей аргумент T любого типа:
fn foo(arg: T) { ... }
Поскольку T был объявлен как обобщённый тип, посредством
Пример ниже демонстрирует синтаксис в действии:
// Конкретный тип `A`.
struct A;
// В определении типа `Single` первому использованию `A` не предшествует ``.
// Поэтому `Single` имеет конкретный тип, и `A` определена выше.
struct Single(A);
// ^ Здесь `A` в первый раз используется в `Single`.
// В данном примере, `` предшествует первому использованию `T`,
// поэтому `SingleGen` является обобщённым типом.
// Поскольку тип параметра `T` является обобщённым, он может быть чем угодно, включая
// конкретный тип `A`, определённый выше.
struct SingleGen(T);
fn main() {
// `Single` имеет конкретный тип и явно принимает параметр `A`.
let _s = Single(A);
// Создаём переменную `_char` типа `SingleGen`
// и присваиваем ей значение `SingleGen('a')`.
// В примере ниже, тип параметра `SingleGen` явно определён.
let _char: SingleGen = SingleGen('a');
// Здесь, `SingleGen` также может иметь неявно определённый параметр типа:
let _t = SingleGen(A); // Используется структура `A`, объявленная выше.
let _i32 = SingleGen(6); // Используется `i32`.
let _char = SingleGen('a'); // Используется `char`.
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Структуры