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