// Поэтому `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

<p id="Смотрите_также_31"><strong><a l:href="#Смотрите_также_31">Смотрите также:</a></strong></p>

Структуры

<p id="Функции_1"><strong><a l:href="#Функции_1">Функции</a></strong></p>

Тот же набор правил применяется и к функциям: тип T становится обобщённым, когда предшествует .

При использовании обобщённых функций, иногда требуется явно указывать тип данных параметров. Это может быть необходимо в случае, если вызываемая функция возвращает обобщённый тип или у компилятора недостаточно информации для вывода необходимого типа данных.

Вызов функции с явно указанными типами данных параметров выглядит так: fun::().

struct A; // Конкретный тип `A`.

struct S(A); // Конкретный тип `S`.

struct SGen(T); // Обобщённый тип `SGen`.

// Все следующие функции становятся владельцем переменной, переданной в них.

// После передачи, она сразу выходит из области видимости и освобождается.

// Объявляем функцию `reg_fn`, которая принимает аргумент `_s` типа `S`.

// Здесь отсутствует ``, поэтому это не обобщённая функция.

fn reg_fn(_s: S) {}

// Объявляем функцию `gen_spec_t`, которая принимает аргумент `_s` типа `SGen`.

// В ней явно задан параметр типа `A`, но поскольку `A` не был указан

// как параметр обобщённого типа для `gen_spec_t`, то он не является обобщённым.

fn gen_spec_t(_s: SGen) {}

// Объявляем функцию `gen_spec_i32`, которая принимает аргумент `_s` типа `SGen`.

// В ней явно задан тип `i32`, который является определённым типом.

Перейти на страницу:

Похожие книги