Какое ключевое слово типа Rust?

Я видел type ключевого слова, используемый в некоторых примерах Rust, но я никогда не видел его объяснения. Вот несколько примеров того, как я видел это:

impl Add<Foo> for Bar {
    type Output = BarFoo;
    // omitted
}

и это, взято из ссылки:

type T = HashMap<i32,String>; // Type arguments used in a type expression
let  x = id::<i32>(10);       // Type arguments used in a call expression

Может кто-нибудь объяснить, что делает это ключевое слово? Я не могу найти его в Rust by Example или в книге Rust.

Ответы

Ответ 1

Простой type Foo = Bar; вне impl определяет псевдоним типа и задокументировано в книге. Существует универсальная версия type Foo<T> =... но если вы понимаете универсальные версии в общем, тогда это очевидное расширение.

type в impl определяет связанный тип. Они описаны в Книге, но я уже написал краткое резюме, так что вы тоже это получите:

Когда у вас есть такая черта, как " Add, вы хотите абстрагироваться не только от того, какие типы вещей можно добавить, но также от типа их суммы. Добавление целых чисел приводит к целым числам, добавление чисел с плавающей точкой приводит к плавающим. Но вы не хотите, чтобы тип результата был параметром Add как в Add<ThingToAdd, ResultType>, по причинам, которые я здесь рассмотрю.

Следовательно, эта черта имеет тип, связанный с impl. Для любой реализации Add, например, impl Add<Foo> for Bar, тип результата добавления уже определен. Это заявлено в черте как это:

trait Add<Rhs> {
    type Result;
    // ...
}

И тогда все реализации определяют тип их результата:

impl Add<Foo> for Bar {
    type Result = BarPlusFoo;
    // ...
}