Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Generics

Узагальнені типи — це тема узагальнення типів і функціональностей для ширших випадків. Це надзвичайно корисно для зменшення дублювання коду багатьма способами, але може вимагати досить складного синтаксису. А саме, бути узагальненим вимагає уважно вказувати, для яких типів узагальнений тип справді вважається дійсним. Найпростішим і найпоширенішим використанням узагальнених типів є параметри типу.

Параметр типу вказується як узагальнений за допомогою кутових дужок і верхнього camel case: <Aaa, Bbb, ...>. “Параметри узагальненого типу” зазвичай представлені як <T>. У Rust “generic” також описує будь-що, що приймає один або кілька параметрів узагальненого типу <T>. Будь-який тип, визначений як параметр узагальненого типу, є узагальненим, а все інше є конкретним (неузагальненим).

Наприклад, визначення узагальненої функції з назвою foo, яка приймає аргумент T будь-якого типу:

fn foo<T>(arg: T) { ... }

Оскільки T було вказано як параметр узагальненого типу за допомогою <T>, воно вважається узагальненим, коли використовується тут як (arg: T). Це так навіть якщо T раніше було визначено як struct.

Цей приклад показує деякий синтаксис у дії:

// A concrete type `A`.
struct A;

// In defining the type `Single`, the first use of `A` is not preceded by `<A>`.
// Therefore, `Single` is a concrete type, and `A` is defined as above.
struct Single(A);
//            ^ Here is `Single`s first use of the type `A`.

// Here, `<T>` precedes the first use of `T`, so `SingleGen` is a generic type.
// Because the type parameter `T` is generic, it could be anything, including
// the concrete type `A` defined at the top.
struct SingleGen<T>(T);

fn main() {
    // `Single` is concrete and explicitly takes `A`.
    let _s = Single(A);

    // Create a variable `_char` of type `SingleGen<char>`
    // and give it the value `SingleGen('a')`.
    // Here, `SingleGen` has a type parameter explicitly specified.
    let _char: SingleGen<char> = SingleGen('a');

    // `SingleGen` can also have a type parameter implicitly specified:
    let _t    = SingleGen(A); // Uses `A` defined at the top.
    let _i32  = SingleGen(6); // Uses `i32`.
    let _char = SingleGen('a'); // Uses `char`.
}

Див. також:

structs